让我们从第一步开始
忘记所有关于套接字的知识。
ZeroMQ 更多的是思考分布式系统(类似多代理)以及如何使用这种智能信号/消息传递框架来设计软件的概念。
这是 ZeroMQ 的核心目标,让设计人员在应用程序领域保持思考,让所有低级的脏工作真正操作起来,而不需要设计人员过多关心。
如果最近刚开始使用 ZeroMQ,在讨论细节之前可以先享受short read about a ZeroMQ global view first,。
阅读并理解 ZeroMQ 层次结构的概念后,从细节开始会更简单:
假设本地 Context() 实例是一个数据泵送引擎,并考虑到 REQ/REP 可扩展的正式通信原型模式,故事是现在实际上是一个关于分布式有限状态自动机网络的故事。
本地进程,仅操作分布式REQ/REP 通信原型的一侧,影响远程进程接收或不接收从本地进程传递到 ZeroMQ 传递服务的消息的权力为零。在公平的信念中指定的接收者。本地进程对远程进程的响应意图的影响越小,所以欢迎来到分布式多代理游戏领域。
REQ 和 REP 的正式行为都必须满足其 { local |分布式模式 }- 预期的行为——REQ 先问,REP 然后回答,以遵守约定的承诺。关键是,这种行为是分布在一对节点之间的,而且在某些情况下,网络事件可能会使分布式 FSA 陷入无法挽救的相互死锁(人们可能会经常在 zeromq 找到更多关于此的帖子)。
因此,您的本地REQ 代码强制.send()-s 并且没有义务停止而不做任何合理的事情,直到REP-side .recv( zmq.NOBLOCK )-s 或没有(没有人有任何形式的保证一个远程节点根本存在,同样,一个人必须让自己准备好预测和处理所有情况,远程方永远不会响应,所以从分布式多代理生态系统的性质出现了许多“新”挑战)。
有一些聪明的方法可以处理这种新型的分布式混乱和不确定性,最好使用.poll() 和.send() 和.recv() 方法的非阻塞形式,因为这些方法可以让用户编码仍然能够及时处理所有预期和意外事件。
一个人也可以操作相当多的共存 ZeroMQ 连接,以便在分布式系统设计中优先考虑和专门化多代理交互的每个和任何形式,即使在故障恢复和类似的高级设计中也是如此鲁棒性概念,其中每个交互的异步性质避免了与远程(甚至可能尚未存在)代理进行任何类型的协调或同步的需要,该代理主要是一个自治实体,拥有自己的控制域,所以再次,主要与本地代理可能“期望”的内容异步,任何其他形式的“影响”越小,而是尝试向“那里”发送消息“电报”。
是的,
ZeroMQ 是异步无代理信号/消息传递框架。
对于(几乎)同步通信,人们可能会采取步骤和措施来减少(主要是分布式的)异步控制循环——最好用 MCVE 示例和详细信息来更新您的帖子要实现的特定目标。