我有一个网站,它向工作服务器发送繁重的处理任务。现在,只有一个工作服务器,但将来会添加更多。这些工作非常耗时(需要5分钟 - 1小时)。我们的想法是建立一个配置,只需构建一个新的工作服务器就足以增加整个系统的容量,而无需在Web服务器部分进行额外配置。
目前,我已经使用python-zeromq和PUSH / PULL架构完成了基本实现。
每当有新的工作请求时,网络服务器就会创建一个套接字,连接到其中一个工作人员并发送工作(不需要回复,这是一种即发即弃的工作类型):
context = zmq.Context()
socket = context.socket(zmq.PUSH)
socket.connect("tcp://IP:5000")
socket.send(msg)
在工人方面,这一直在运行:
context = zmq.Context()
socket = context.socket(zmq.PULL)
# bind to port in it's own IP
socket.bind("tcp://IP:5000")
print("Listening for messages...")
while True:
msg = socket.recv()
<do something>
现在我更加注重这一点,我认为这不是正确的做法。由于添加新的工作服务器需要将其IP添加到Web服务器脚本,请连接到它们等。
我宁愿让网络服务器拥有持久套接字(并且不是每次都创建一个套接字),而是让工作人员连接到网络服务器。有点像这里: https://github.com/taotetek/blog_examples/blob/master/python_multiprocessing_with_zeromq/workqueue_example.py
简而言之,与上面的内容相反,webserver的套接字绑定到自己的IP,工作者连接到它。我想这些作业是通过循环方式发送的。
然而,我担心的是,如果网络服务器重新启动(经常发生的事情)或者离线一段时间会发生什么。使用zeromq,将是所有工人 连接会挂起吗?不知何故变得无效?如果网络服务器出现故障,当前队列会消失吗?
在目前的设置中,事情似乎运行得有点好,但我并不是100%确定这样做的正确(而不是太复杂)的方式。
答案 0 :(得分:1)
来自ZeroMQ Guide:
组件可以动态进出,ØMQ会自动重新连接。
如果基础tcp连接中断,ZeroMQ将反复尝试重新连接,一旦连接成功就发送消息。
请注意,PAIR套接字是一个例外。它们不会自动重新连接。 (参见zmq_socket docs。)
答案 1 :(得分:0)
服务器上的绑定可能有效。您确定不会需要多个Web服务器吗?我考虑在您的服务器和工作人员之间放置一个经纪人。
无论哪种方式,我认为持久套接字是可行的方法。