1

我有一个网站,它向工作服务器发送繁重的处理任务。目前,只有一个工作服务器,但将来会添加更多。这些工作非常耗时(需要 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% 确定这样做的正确(而且不太复杂)的方式是什么。

4

2 回答 2

1

来自ZeroMQ 指南

组件可以动态地来来去去,ØMQ 会自动重新连接。

如果底层的 tcp 连接断开,ZeroMQ 将反复尝试重新连接,一旦连接成功就发送您的消息。

请注意,PAIR 套接字是一个例外。它们不会自动重新连接。(请参阅zmq_socket 文档。)

于 2012-08-03T04:57:26.090 回答
0

服务器上的绑定可能会起作用。但是,您确定您永远不需要超过一台 Web 服务器吗?我会考虑在您的服务器和工作人员之间放置一个代理。

无论哪种方式,我认为持久套接字是要走的路。

于 2012-08-03T12:03:28.033 回答