我是rabbitmq的新手,并试图弄清楚如何通过本教程(https://www.rabbitmq.com/tutorials/tutorial-six-python.html)让客户端请求服务器,其中包含有关内存和CPU利用率的信息。
所以客户端请求CPU和内存(我相信我需要两个队列),服务器会回复这些值。
无论如何使用Python中的Pika库来简单地创建一个client.py
和server.py
。
答案 0 :(得分:0)
如果您还没有,我会建议您按照第一个RabbitMQ tutorials进行操作。 RPC示例基于前面示例中涵盖的概念(直接队列,独占队列,确认等)。
本教程中提出的RPC解决方案至少需要两个队列,具体取决于您要使用的客户端数量:
rpc_queue
),用于将请求从客户端发送到服务器。请求/响应周期:
rpc_queue
发送消息。每条消息都包含reply_to
属性,其中包含服务器应回复的客户端专用队列的名称,以及correlation_id
属性,该属性只是用于跟踪的唯一 id 请求。rpc_queue
上的消息。当消息到达时,它准备响应,将correlation_id
添加到新消息,并将其发送到reply_to
消息属性中定义的队列。correlation_id
的消息。直接跳到您的问题,首先要做的是定义您希望在回复中使用的邮件格式。您可以使用JSON,msgpack或任何其他序列化库。例如,如果使用JSON,则一条消息可能如下所示:
{
"cpu": 1.2,
"memory": 0.3
}
然后,在server.py
:
def on_request(channel, method, props, body):
response = {'cpu': current_cpu_usage(),
'memory': current_memory_usage()}
properties = pika.BasicProperties(correlation_id=props.correlation_id)
channel.basic_publish(exchange='',
routing_key=props.reply_to,
properties=properties,
body=json.dumps(response))
channel.basic_ack(delivery_tag=method.delivery_tag)
# ...
在client.py
:
class ResponseTimeout(Exception): pass
class Client:
# similar constructor as `FibonacciRpcClient` from tutorial...
def on_response(self, channel, method, props, body):
if self.correlation_id == props.correlation_id:
self.response = json.loads(body.decode())
def call(self, timeout=2):
self.response = None
self.correlation_id = str(uuid.uuid4())
self.channel.basic_publish(exchange='',
routing_key='rpc_queue',
properties=pika.BasicProperties(
reply_to=self.callback_queue,
correlation_id=self.correlation_id),
body='')
start_time = time.time()
while self.response is None:
if (start_time + timeout) < time.time():
raise ResponseTimeout()
self.connection.process_data_events()
return self.response
如您所见,代码与原始FibonacciRpcClient
几乎相同。主要区别是:
call()
方法不需要body
参数(没有任何内容可以发送到服务器)尽管如此,还有很多需要改进的地方:
reply_to
队列,我们的服务器会崩溃,并且会在重新启动时再次崩溃(只要我们的服务器没有确认,损坏的消息将无限次重新发送)您也可以考虑使用发布/订阅模式替换RPC方法;通过这种方式,服务器每隔X个时间间隔简单地广播其CPU /内存状态,并且一个或多个客户端接收更新。