【问题标题】:How to know if a ZeroMQ socket is ready?如何知道 ZeroMQ 套接字是否准备就绪?
【发布时间】:2018-03-11 23:37:35
【问题描述】:

我在 Python 中有一个简单的PUSH/PULL ZeroMQ 代码。如下所示。

  def zmqtest(self):

     print('zmq')
     Process(target=start_consumer, args=('1', 9999)).start()
     Process(target=start_consumer, args=('2', 9999)).start()

     ctx = zmq.Context()
     socket = ctx.socket(zmq.PUSH)
     socket.bind('tcp://127.0.0.1:9999')
     # sleep(.5) # I have to wait here...

     for i in range(5):
        socket.send_unicode('{}'.format(i))

问题是我必须等待超过 .5 秒才能发送消息,否则只有一个消费者进程可以接收消息。如果我等待超过 0.5 秒,一切看起来都很好。

我想套接字绑定需要一段时间才能稳定下来,并且它是异步完成的。

我想知道是否有更可靠的方法可以知道套接字何时准备就绪。

【问题讨论】:

标签: python zeromq


【解决方案1】:

确定需要一段时间。
确定它是异步完成的。

让我们先破坏一下术语。

ZeroMQ 是一个很棒的框架。每个分布式系统的客户端都愿意使用它(除了只使用 inproc:// 传输类),首先实例化一个异步数据泵引擎.. Context()实例,根据需要。

每个可扩展的正式通信模式{ PUSH | PULL | ... | XSUB | SUB | PAIR }创建一个套接字,
但是
而是实例化一个访问点,稍后可能会.connect().bind() 到某个交易对手(另一个访问点,适当类型,在某些Context() 实例中,无论是本地还是非本地(同样,local-inproc://-only 基础设施是该规则的已知例外)。

从这个意义上说,要回答“套接字何时准备就绪?”这个问题需要“跨”分布式系统进行端到端调查,处理所有参与的元素socket 类似行为的实现。


测试“本地”终端接入点 RTO 状态:

为此,您的代理可以自连接接收接入点(作为 PULL 原型工作),以便“嗅探”,当本地端 Context() 实例已达到 RTO 状态 + .bind()- 创建的 O/S L3+ 接口开始分发预期代理的-PUSH-ed 消息。


测试“远程”代理的 RTO 状态:

这部分可以进行间接或显式测试。间接方式可以使用消息嵌入索引。它可以包含一个提升数字(一个序数),它包含关于订单的弱信息。鉴于PUSH-side 消息路由策略是循环的,本地代理可以肯定,直到它是本地的PULL-access-point 接收所有指示连续序列的消息,没有其他“远程“-PULL-ing 代理处于 RTO 状态。一旦“本地”PULL-access-point 在序数流中接收到“间隙”,这意味着(当然,只有在所有PUSH.setsockopt()-s 设置正确的情况下)还有另一个-- 非本地 -- PULL-ing 代理处于 RTO 状态。


这个有用吗?

也许是,也许不是。重点是更好地理解任何分布式系统必须以某种方式应对的新挑战。

多阶段消息队列的本质,多层实现(local-PUSH-agent's-code,localContext()-thread(s),local-O/S,local-kernel,LAN/WAN , remote-kernel, remote-O/S, remote Context()-thread(s), remote-PULL-agent's-code 仅举几例)和多代理行为只是引入了许多地方,其中操作可能以其他方式获得延迟/阻塞/死锁/失败。

是的,在野外散步。

尽管如此,人们可能会选择使用更丰富、更明确的信号(除了最初认为的只是原始数据传输)并帮助解决多智能体世界中特定于上下文、信号 RTO 感知的行为,这可能更好地反映实际情况,并且还可以解决开始出现在分布式系统的非单体世界中的其他问题。

显式信号是一种应对方法。


微调 ZeroMQ 基础架构。忘记使用默认值。总是!

最近的 API 版本开始添加更多选项,以针对特定用例微调 ZeroMQ 行为。请务必仔细阅读所有可用于设置 Context()-instance 的详细信息,以调整套接字实例访问点行为,使其最符合您的分布式系统信令 + 传输需求:

.setsockopt( ZMQ_LINGER,     0 )         # always, indeed ALWAYS
.setsockopt( ZMQ_SNDBUF,    .. )         # always, additional O/S + kernel rules apply ( read more about proper sizing )
.setsockopt( ZMQ_SNDHWM,    .. )         # always, problem-specific data-engineered sizing
.setsockopt( ZMQ_TOS,       .. )         # always, indeed ALWAYS for critical systems
.setsockopt( ZMQ_IMMEDIATE, .. )         # prevents "loosing" messages pumped into incomplete connections

还有更多。没有这些,设计将继续被钉在现实世界交易丛林中的棺材里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 2023-03-11
    • 2019-09-01
    • 2015-10-20
    • 1970-01-01
    相关资源
    最近更新 更多