确定需要一段时间。
确定它是异步完成的。
让我们先破坏一下术语。
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
还有更多。没有这些,设计将继续被钉在现实世界交易丛林中的棺材里。