python - 对于将即发即弃任务发送到一堆 Web 服务器的 Web 服务器来说,正确的 ZMQ 架构是什么?

标签 python web-applications distributed-computing zeromq

我有一个网站,它将繁重的处理任务发送到工作服务器。目前,只有一台工作服务器,但将来会添加更多。这些工作非常耗时(需要 5 分钟 - 1 小时)。我们的想法是建立一个配置,只需构建一个新的工作服务器就足以增加整个系统的容量,而不需要在网络服务器部分进行额外的配置。

目前,我已经使用 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 添加到网络服务器脚本中,因此需要连接到它们等等。

我更希望网络服务器有一个持久套接字(而不是每次都创建一个),并让工作人员连接到网络服务器。有点像这里: https://github.com/taotetek/blog_examples/blob/master/python_multiprocessing_with_zeromq/workqueue_example.py

简而言之,与上面的相反,网络服务器的套接字绑定(bind)到它自己的 IP,并且工作人员连接到它。我想然后作业是通过循环方式发送的。

但是我担心的是,如果网络服务器重新启动(这种情况经常发生)或离线一段时间会发生什么。使用 Zeromq,所有 worker 都会 连接会挂起吗?不知何故变得无效?如果网络服务器宕机,当前队列会消失吗?

在当前设置中,事情似乎运行得不错,但我不能 100% 确定什么是正确的(而且不太复杂)的方法。

最佳答案

来自ZeroMQ Guide :

Components can come and go dynamically and ØMQ will automatically reconnect.

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

请注意,PAIR 套接字是一个异常(exception)。它们不会自动重新连接。 (请参阅zmq_socket docs。)

关于python - 对于将即发即弃任务发送到一堆 Web 服务器的 Web 服务器来说,正确的 ZMQ 架构是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11708864/

相关文章:

javascript - 将文本字段的值返回给 JavaScript

python - 如何使用 ZeroMQ 通过 TCP 套接字发送 PNG 图像?

java - 在 COMPAS 中定义的任务中找不到文件

python - 没有 Spark 的 Kafka 到 Pandas 数据框

python - Linux 上的 cffi 包安装错误

java - 适用于 Web 应用程序的免费模型工具?

distributed-computing - 为什么这个输出是错误的? - 顺序一致性

python - 如何遍历和搜索 python 字典?

python - Pyparsing:解析带有 key=value 的嵌套明文数据

javascript - 当选择值作为另一个选择的函数动态加载时,如何在不使用 ctrl 键的情况下选择多个值