考虑以下示例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进程中一个套接字可以有多少个请求?
将多个套接字绑定到前端是否理想?
答案 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套接字之前的其他系统资源,但该决定将来自您的应用程序的细节。
因此,一般情况下,从单个套接字开始,尽可能多地挤出它,当您看到通过水平扩展可以提高性能时,请查看您的具体情况以确定最佳方法那样做。