[英]RPC calls to multiple consumers
我有一個用於偵聽消息的消費者,如果消息流超過消費者可以處理的消息我想要啟動此消費者的另一個實例。
但我也希望能夠從消費者那里查詢信息,我的想法是我可以使用RPC通過使用扇出交換從生產者請求此信息,以便所有生產者獲得RPC調用。
我的問題首先是這是可能的,其次是合理的嗎?
如果問題是“是否可以將RPC消息發送到多個服務器?” 答案是肯定的。
在構建RPC調用時,將臨時隊列附加到消息中(通常在header.reply_to中,但您也可以使用內部消息字段)。 這是RPC目標將發布其答案的隊列。
當您將RPC發送到單個服務器時,您可以在臨時隊列上收到多條消息:這意味着可以通過以下方式形成RPC答案:
這種情況中出現的問題是
只是一些代碼來展示你如何做到這一點(Python與Pika庫)。 請注意,這遠非完美:最大的問題是你應該在獲得新答案時重置超時。
def consume_rpc(self, queue, result_len=1, callback=None, timeout=None, raise_timeout=False):
if timeout is None:
timeout = self.rpc_timeout
result_list = []
def _callback(channel, method, header, body):
print "### Got 1/%s RPC result" %(result_len)
msg = self.encoder.decode(body)
result_dict = {}
result_dict.update(msg['content']['data'])
result_list.append(result_dict)
if callback is not None:
callback(msg)
if len(result_list) == result_len:
print "### All results are here: stopping RPC"
channel.stop_consuming()
def _outoftime():
self.channel.stop_consuming()
raise TimeoutError
if timeout != -1:
print "### Setting timeout %s seconds" %(timeout)
self.conn_broker.add_timeout(timeout, _outoftime)
self.channel.basic_consume(_callback, queue=queue, consumer_tag=queue)
if raise_timeout is True:
print "### Start consuming RPC with raise_timeout"
self.channel.start_consuming()
else:
try:
print "### Start consuming RPC without raise_timeout"
self.channel.start_consuming()
except TimeoutError:
pass
return result_list
經過一番研究,似乎這是不可能的。 如果您查看RabbitMQ.com上的教程,您會看到該調用有一個id,據我所知,它被消耗掉了。
我選擇了另一種方式,即讀取日志文件並聚合數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.