Web服务器向一堆Web服务器发送即发即弃任务的ZMQ架构是什么?

时间:2012-07-29 11:28:13

标签: python web-applications distributed-computing zeromq

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

2 个答案:

答案 0 :(得分:1)

来自ZeroMQ Guide

  

组件可以动态进出,ØMQ会自动重新连接。

如果基础tcp连接中断,ZeroMQ将反复尝试重新连接,一旦连接成功就发送消息。

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

答案 1 :(得分:0)

服务器上的绑定可能有效。您确定不会需要多个Web服务器吗?我考虑在您的服务器和工作人员之间放置一个经纪人。

无论哪种方式,我认为持久套接字是可行的方法。

相关问题