簡體   English   中英

RPC調用多個消費者

[英]RPC calls to multiple consumers

我有一個用於偵聽消息的消費者,如果消息流超過消費者可以處理的消息我想要啟動此消費者的另一個實例。

但我也希望能夠從消費者那里查詢信息,我的想法是我可以使用RPC通過使用扇出交換從生產者請求此信息,以便所有生產者獲得RPC調用。

我的問題首先是這是可能的,其次是合理的嗎?

如果問題是“是否可以將RPC消息發送到多個服務器?” 答案是肯定的。

在構建RPC調用時,將臨時隊列附加到消息中(通常在header.reply_to中,但您也可以使用內部消息字段)。 這是RPC目標將發布其答案的隊列。

當您將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM