【问题标题】:How to implement proxy/broker for (X)PUB/(X)SUB messaging in ZMQ?如何在 ZMQ 中实现 (X)PUB/(X)SUB 消息的代理/代理?
【发布时间】:2013-08-15 13:39:59
【问题描述】:

所以我正在阅读this article,了解如何在 ZMQ 中为 (X)PUB/(X)SUB 消息传递创建代理/代理。有一张漂亮的图片,描绘了建筑应该是什么样子:

但是当我查看XSUB socket description 时,我不知道如何通过它转发所有订阅,因为它的Outgoing routing strategyN/A

那么如何在 ZeroMQ 中实现(取消)订阅转发,这种转发应用程序的最小用户代码是多少(可以插入简单的 PublisherSubscriber 样本之间的代码)?

【问题讨论】:

    标签: c++ message-queue zeromq


    【解决方案1】:

    XPUB 确实接收消息 - 它接收的唯一消息是来自已连接订阅者的订阅,这些消息应通过 XSUB 按原样向上游转发。

    传递消息最简单的方法是使用zmq_proxy

    xpub = ctx.socket(zmq.XPUB)
    xpub.bind(xpub_url)
    xsub = ctx.socket(zmq.XSUB)
    xsub.bind(xsub_url)
    pub = ctx.socket(zmq.PUB)
    pub.bind(pub_url)
    zmq.proxy(xpub, xsub, pub)
    

    它将向/从 xpub 和 xsub 中继消息。或者,您可以添加一个 PUB 套接字来监控通过任一方向的流量。

    如果您希望中间的用户代码实现额外的路由逻辑,您可以这样做, 它重新实现了zmq_proxy的内部循环:

    def broker(ctx):
        xpub = ctx.socket(zmq.XPUB)
        xpub.bind(xpub_url)
        xsub = ctx.socket(zmq.XSUB)
        xsub.bind(xsub_url)
    
        poller = zmq.Poller()
        poller.register(xpub, zmq.POLLIN)
        poller.register(xsub, zmq.POLLIN)
        while True:
            events = dict(poller.poll(1000))
            if xpub in events:
                message = xpub.recv_multipart()
                print "[BROKER] subscription message: %r" % message[0]
                xsub.send_multipart(message)
            if xsub in events:
                message = xsub.recv_multipart()
                # print "publishing message: %r" % message
                xpub.send_multipart(message)
    
            # insert user code here
    

    full working (Python) example

    【讨论】:

    • 您可以用zmq.proxy(xsub, xpub)(C 中的zmq_proxy())替换从poller = … 开始的所有内容。唯一的事情是,要查看传输中的消息,您需要传入一个捕获套接字作为第三个参数,这有点复杂。
    • 这没有抓住重点,即在设备内部添加了用户代码。如果您不需要 XPUB 和 XSUB 之间的代码,则代理可以正常工作(或者在 Python 中您可以使用 monitor_queue,zmq_proxy 的前身)。
    • 从短语“什么是此类转发应用程序的最小用户代码”中,我似乎很清楚 OP 没有他们想要在 XSUB 和 XPUB 之间注入的代码块.他们只想要一个最小的转发解决方案。即便如此,提供更灵活的解决方案是完全可以的,但应该让 OP 意识到,如果他们不需要玩 MITM,则存在一个更简单的解决方案。
    • 有道理,我会更新答案,说明何时适合手动经纪人。
    • 用 Python 回答一个 C++ 问题 - 太好了!在语言移植方面,我的 ZMQ 人员所做的工作简直无法想象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多