gpt4 book ai didi

ZeroMQ/ZMQ 推/拉模式的实用性

转载 作者:行者123 更新时间:2023-12-03 07:10:42 34 4
gpt4 key购买 nike

在尝试 ZeroMQ Push/Pull (他们称之为 Pipeline)套接字类型时,我很难理解这个图案。它被称为“负载均衡器”。

假设单个服务器将任务发送给多个工作人员,推/拉将在所有客户端之间平均分配任务。 3 个客户端和 30 个任务,每个客户端获取 10 个任务:客户端 1 获取任务 1, 4, 7,... 客户端 2, 2, 5,... 等等。很公平。从字面上看。

然而,在实践中,任务复杂性或客户端计算资源(或可用性)通常是非同质的混合,那么这种模式就会被严重破坏。所有任务似乎都是提前安排好的,服务器不知道客户端的进度,甚至不知道它们是否可用。如果 client1 出现故障,其剩余任务不会发送到其他客户端,而是保留在 client1 的队列中。如果 client1 保持关闭状态,则永远不会处理这些任务。相反,如果客户端处理任务的速度更快,则它不会获得更多任务并保持空闲状态,因为它们仍为其他客户端安排。

使用REQ/REP是一种可能的解决方案;然后,任务仅分配给可用资源。

所以我错过了什么吗?如何有效地使用Push/Pull?有没有办法处理这种套接字类型的客户端、任务等的不对称性?

谢谢!

这是一个简单的 Python 示例:

# server

import zmq
import time

context = zmq.Context()
socket = context.socket(zmq.PUSH)
#socket = context.socket(zmq.REP) # uncomment for Req/Rep

socket.bind("tcp://127.0.0.1:5555")

i = 0
time.sleep(1) # naive wait for clients to arrive

while True:
#msg = socket.recv() # uncomment for Req/Rep
socket.send(chr(i))
i += 1
if i == 100:
break

time.sleep(10) # naive wait for tasks to drain

.

# client

import zmq
import time
import sys

context = zmq.Context()

socket = context.socket(zmq.PULL)
#socket = context.socket(zmq.REQ) # uncomment for Req/Rep

socket.connect("tcp://127.0.0.1:5555")

delay = float(sys.argv[1])

while True:
#socket.send('') # uncomment for Req/Rep
message = socket.recv()
print "recv:", ord(message)
time.sleep(delay)

在命令行上启动带有延迟参数的 3 个客户端(即 1、1 和 0.1),然后启动服务器,看看所有任务是如何均匀分布的。然后终止其中一个客户端以查看其剩余任务是否未处理。

取消注释指示的行,将其切换到 Req/Rep 类型套接字并观察更有效的负载平衡器。

最佳答案

它不是负载均衡器,这是一个错误的解释,在 0MQ 文档中停留了一段时间。要进行负载平衡,您必须从工作人员那里获取一些有关其可用性的信息。 PUSH 与 DEALER 一样,是一个循环分配器。它的原始速度和简单性非常有用。您不需要任何形式的喋喋不休,只需将任务推送到管道中,它们就会以网络能够处理的速度尽可能快地分发给所有可用的工作人员。

当您执行大量小任务并且工作人员不经常进出时,该模式非常有用。该模式不适用于需要时间才能完成的较大任务,因为这样您就需要一个仅向可用工作人员发送新任务的队列。它还存在一种反模式,即如果客户端发送许多任务然后工作人员连接,则第一个工作人员将抓取 1,000 条左右的消息,而其他工作人员仍在忙于连接。

您可以通过多种方式创建自己的高级路由。查看指南中的 LRU 模式:在该模式中,工作人员明确告诉代理“准备好”。您还可以进行基于信用的流量控制,这就是我在任何实际负载平衡情况下都会做的事情。它是 LRU 模式的推广。请参阅http://hintjens.com/blog:15

关于ZeroMQ/ZMQ 推/拉模式的实用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12504559/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com