你能在ZeroMQ中创建一个集中的主题吗?

时间:2015-03-05 20:38:47

标签: c# php .net zeromq

我真的很想尝试ZeroMQ,我想知道我的问题是否可以用它来解决。

问题:我有多个订阅者和多个发布者。在集中式代理体系结构中,发布者将向主题发布消息(类似于多播地址),并且订阅者将从主题获取消息并对消息进行操作。我无法使用多播,因为我们的网络拓扑有多个子网,IT人员不会将我的多播数据包转发到所有子网。

由于没有集中式代理,如何在ZeroMQ中解决这个问题? (示例代码在任何语言中都很棒)

2 个答案:

答案 0 :(得分:1)

这是一个非常简单的问题,但我会尝试给你一些指导...只是理解你没有描述实际问题,只是一个用例,根据你的具体情况有几个潜在的解决方案需要。

在最基本的层面上,您可以让每个订阅者都维护每个发布者的列表,并直接订阅每个订阅者。这是非常蛮力和手册,但这是完成你想要的第一步。

如果维护该列表成为每个节点的棘手问题,则可以创建一个新节点来管理您的订户列表。当发布者旋转时,它会向管理者节点发出自己的通知,通知订阅者他们需要订阅它。

如果我们正在谈论真正大量的发布者和订阅者,并且完整的网络拓扑需要解决问题,您可以编写自己的代理来订阅每个发布者,然后重新发布给所有订阅者。

每种解决方案都有细微差别,但从高层次来看,这是您的三个基本选择。如果你有一些最适合你情况的感觉,并且需要进一步的指导,请添加更多细节,我们可以详细说明。

答案 1 :(得分:0)

正在做一些阅读。毕竟这在ZeroMQ中是可能的。您可以使用“FORWARDER”设备:

Instructions

import zmq

def main():

    try:
        context = zmq.Context(1)
        # Socket facing clients
        frontend = context.socket(zmq.SUB)
        frontend.bind("tcp://*:5559")

        frontend.setsockopt(zmq.SUBSCRIBE, "")

        # Socket facing services
        backend = context.socket(zmq.PUB)
        backend.bind("tcp://*:5560")

        zmq.device(zmq.FORWARDER, frontend, backend)
    except Exception, e:
        print e
        print "bringing down zmq device"
    finally:
        pass
        frontend.close()
        backend.close()
        context.term()

if __name__ == "__main__":
    main()