什么时候应该在zmq ROUTER套接字中绑定多个客户端

时间:2016-03-16 16:31:30

标签: python zeromq

考虑以下示例ZMQ经纪人计划:

def startBroker ():
# Prepare our context and sockets
    context = zmq.Context()
    frontend = context.socket(zmq.ROUTER)
    backend = context.socket(zmq.DEALER)
    frontend.bind("tcp://*:5555")
    frontend.bind("tcp://*:5558")
    backend.bind("tcp://*:5556")
    backend.bind("tcp://*:5557")

    # Initialize poll set
    poller = zmq.Poller()
    poller.register(frontend, zmq.POLLIN)
    poller.register(backend, zmq.POLLIN)

    # Switch messages between sockets
    while True:
        socks = dict(poller.poll())

    if socks.get(frontend) == zmq.POLLIN:
        message = frontend.recv_multipart()
        backend.send_multipart(message)

    if socks.get(backend) == zmq.POLLIN:
        message = backend.recv_multipart()
        frontend.send_multipart(message)

开发人员必须考虑将多个套接字绑定到前端的参数是什么?

  

frontend.bind( “TCP:// *:5555”)

ROUTER进程中一个套接字可以有多少个请求?

将多个套接字绑定到前端是否理想?

1 个答案:

答案 0 :(得分:1)

似乎可能存在对代码正在做什么的误解。

frontend = context.socket(zmq.ROUTER)

该代码创建一个ROUTER套接字并将其存储在frontend中。 frontend现在是ROUTER套接字。

frontend.bind("tcp://*:5555")
frontend.bind("tcp://*:5558")

该代码bind()是单个套接字到多个端点上的代码。我认为在bind()的一次调用中有不同的语义,但this link似乎表明你按照你在此处的方式进行操作。

无法将多个套接字绑定到相同的端点。您将收到该地址正在使用的错误。在你的情况下,如果你真的需要两个套接字,你将不得不做类似下面的事情,细节将在很大程度上取决于你的特定用例:

context = zmq.Context()
frontend1 = context.socket(zmq.ROUTER)
frontend2 = context.socket(zmq.ROUTER)
backend1 = context.socket(zmq.DEALER)
backend2 = context.socket(zmq.DEALER)
frontend1.bind("tcp://*:5555")
frontend2.bind("tcp://*:5558")
backend1.bind("tcp://*:5556")
backend2.bind("tcp://*:5557")

...但是,我不建议不要遇到一个无法在单个插座上解决的特定问题(我想,这是你的问题首先在这里 - 在底部回答。)

在我进入之前,你的代理在这里充当一个简单的转发代理,并且有更多直接的ZMQ语义来实现zmq_proxy(),你可以看到示例here,相关位复制到这里:

context = zmq.Context()

# Socket facing clients
frontend = context.socket(zmq.ROUTER)
frontend.bind("tcp://*:5559")

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

zmq.proxy(frontend, backend)

# We never get here…
frontend.close()
backend.close()
context.term()

...该代码完成了代码所做的相同的事情,在更多" ZMQ适当的"办法。此示例代码来自ZMQ Guide,整个指南中有大量Python代码示例,我强烈建议您阅读它。

所以,这里是问题的答案(释义)"开发人员何时应该选择使用多个套接字来满足特定的服务需求":

很少。理论上,单个ZMQ套接字可以每秒处理百万个的消息。消息大小很重要,当然,您受到连接带宽的限制,并且内存中的移动内容不是免费的,但理论上,单个ZMQ套接字可以处理大多数常规工作负载。如果你想加载平衡,你通常会在一个完全独立的主机上启动一个新进程,但它可能会在同一个进程中启动第二个套接字,这取决于你的阻塞点是什么 - 它&# 39;它可能是ZMQ套接字之前的其他系统资源,但该决定将来自您的应用程序的细节。

因此,一般情况下,从单个套接字开始,尽可能多地挤出它,当您看到通过水平扩展可以提高性能时,请查看您的具体情况以确定最佳方法那样做。