【问题标题】:ZeroMQ PULL get all messages in queueZeroMQ PULL 获取队列中的所有消息
【发布时间】:2017-05-21 06:05:44
【问题描述】:

我有大量(~100)PUSH“客户端”定期(~1 / s)向PULL“服务器”发送消息。服务器以每秒约 2 批的速度分批处理消息。批量大小不是固定的——理想情况下,我想在每次迭代时处理队列中的所有消息。我获取队列中所有消息的代码如下:

buffer = []
while True:
  try:
    buffer.append(socket.recv_pyobj(zmq.NOBLOCK))
  except zmq.ZMQError as e:
    break
print(len(buffer))

这似乎可行,但缓冲区长度在两次迭代之间变化很大。通常,我希望每次阅读约 50 条消息。但是,我经常看到许多迭代少于 10 条消息,然后是一个非常大的消息(约 1000 条)。我怀疑我在缓冲或类似的事情上做错了,因为这不应该发生。

【问题讨论】:

    标签: zeromq pyzmq


    【解决方案1】:

    接收方的高度动态变化?

    我的怀疑是 PULL 方面的公平队列策略,硬连线在 .Context() 低级数据泵内,它服务于(如下)所有.connect()-ed 对等方的强制工作周期。

    除非您能够以某种方式平衡馈送 PUSH-ers 发送各自消息的延迟,否则公平排队接收周期将完全按照您报告的方式,显示那些没有PUSH“及时”他们的下一条消息的人。

    【讨论】:

    • 我不太明白你在说什么(包括“nivelise”的意思)。你能更详细地解释一下吗?无论如何,我首先通过 50 次阻塞 recvs 来缓解这种情况 - 现在变化在 50-150 范围内,这是合理的。这种修改似乎不会对每次迭代所花费的时间增加任何惩罚
    • ~ 均衡延迟,即所有(几乎)相同
    • 有没有办法禁用公平排队,或者我可以使用其他一些选项来提高性能?
    • 用你的话说,这个分​​布式系统的性能衡量标准是什么?你建议使用什么衡量标准?如果设计的代码既对传入事件流进行零控制,又对接收 PULL 端传入任务的处理进行零(自己)控制,那么您对所说的“改进”的想法是什么?性能”?
    猜你喜欢
    • 2013-12-13
    • 2018-08-10
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 2013-12-18
    相关资源
    最近更新 更多