我有一个网站,它向工作服务器发送繁重的处理任务。目前,只有一个工作服务器,但将来会添加更多。这些工作非常耗时(需要 5 分钟 - 1 小时)。这个想法是有一个配置,只需构建一个新的工作服务器就足以增加整个系统的容量,而无需在 webserver 部分进行额外配置。
目前,我已经使用 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 添加到 webserver 脚本中,连接到它们等等。
我宁愿让网络服务器有一个持久的套接字(而不是每次都创建一个),而是让工作人员连接到网络服务器。有点像这里: https ://github.com/taotetek/blog_examples/blob/master/python_multiprocessing_with_zeromq/workqueue_example.py
简而言之,与上面的相反,webserver 的套接字绑定到它自己的 IP,并且工作人员连接到它。我想然后作业是通过循环方式发送的。
但是我担心的是,如果网络服务器重新启动(经常发生的事情)或离线一段时间会发生什么。使用 zeromq,所有工作连接都会挂起吗?不知何故变得无效?如果网络服务器宕机,当前队列会消失吗?
在当前的设置中,事情似乎运行得有些好,但我不能 100% 确定这样做的正确(而且不太复杂)的方式是什么。