Asynchronous ZeroMQ中同步套接字的混淆

Asynchronous ZeroMQ中同步套接字的混淆,asynchronous,zeromq,synchronous,Asynchronous,Zeromq,Synchronous,这可能看起来是一个愚蠢的问题,但我对ZeroMQ中有关同步套接字的术语感到困惑 据我所知,同步通信发生在客户端发送消息时,然后阻塞,直到响应到达。如果ZeroMQ实现了同步通信,那么对于同步套接字来说,只有.send()方法就足够了 我认为ZeroMQ的同步套接字术语仅指在最后一条消息的响应到达之前无法发送更多消息,但“发送方”仍然可以异步继续处理(做更多的事情) 这是真的吗 在这种情况下,是否有任何简单的方法可以使用ZeroMQ实现同步通信 编辑:当我想在远程进程(如RPC)中调用方法时,同步

这可能看起来是一个愚蠢的问题,但我对ZeroMQ中有关同步套接字的术语感到困惑

据我所知,同步通信发生在客户端发送消息时,然后阻塞,直到响应到达。如果ZeroMQ实现了同步通信,那么对于同步套接字来说,只有
.send()
方法就足够了

我认为ZeroMQ的同步套接字术语仅指在最后一条消息的响应到达之前无法发送更多消息,但“发送方”仍然可以异步继续处理(做更多的事情)

这是真的吗

在这种情况下,是否有任何简单的方法可以使用ZeroMQ实现同步通信

编辑:当我想在远程进程(如RPC)中调用方法时,同步通信是有意义的。如果我想在远程进程中执行一系列命令,并且每个命令都需要前一个命令的结果来完成它的工作,那么异步通信不是最好的选择

让我们从第一步开始
忘掉你所知道的关于套接字的一切。 ZeroMQ更像是一个考虑分布式系统(类似于多代理)以及如何使用这种智能信令/消息传递框架设计软件的概念

这是ZeroMQ的核心目标,允许设计人员在应用程序域中思考,让所有低级别的脏活在实际操作中,而不需要设计人员太多的关心

如果您最近刚开始使用ZeroMQ,您可能会在讨论细节之前先体验一下

阅读并理解了ZeroMQ层次结构的概念后,从细节开始更简单:

  • 给定一个本地
    Context()
    实例是一个数据泵送引擎,并且考虑到一个
    REQ/REP
    可伸缩的正式通信原型模式,现在的故事实际上是一个关于分布式有限状态自动机网络的故事

  • 本地进程,仅操作分布式
    REQ/REP
    通信原型的一侧,对于影响远程进程接收或不接收从本地进程传递到ZeroMQ传递服务的消息(以公平的方式)的能力为零。本地进程对远程进程的响应意图的影响越小,所以欢迎来到分布式多代理游戏领域

REQ
REP
正式行为必须满足{local | distributed mode}期望的行为类型--
REQ
先问,
REP
然后回答,以遵守约定的承诺。关键是,这种行为分布在一对节点之间,并且在某些情况下,网络事件可能会使分布式FSA陷入无法解决的相互死锁(人们可能会经常在这里找到更多关于这方面的帖子)

因此,您的本地端
REQ
code必须
.send()
-s,并且在
REP
-side
.recv(zmq.NOBLOCK)
-s之前没有义务停止而不做任何合理的事情(对于远程节点的存在,没有人有任何担保,同样,必须让自己做好准备,以预测和处理所有情况,因为远程端永远不会响应,所以分布式多代理生态系统的性质会出现许多“新”挑战)

有一些聪明的方法可以处理这种新类型的分布式混乱和不确定性,最好使用
.poll()
.send()
.recv()
-方法的非阻塞形式,因为这些方法让用户代码能够在适当的时间和方式处理所有预期和未预期的事件

人们还可以操作相当多的共存的ZeroMQ连接,以便在分布式系统设计中对每个和任何形式的多代理交互进行优先级排序和专门化,甚至在故障恢复和类似的高级健壮性概念中进行设计,其中每个交互的异步性质避免了任何种类的需求与远程(可能甚至还不存在)代理进行协调或同步,远程代理主要是一个自治实体,拥有自己的控制域,因此,与本地代理可能“预期”的内容基本上是异步的,除尝试发送“那里”消息“电报”外,任何其他形式的“影响”越小

是的,
ZeroMQ是异步无代理信令/消息传递框架。
对于(几乎)同步通信,可以采取步骤和措施减少(主要分布的)异步控制循环——最好用一个MCVE示例更新您的帖子,并详细说明您要实现的特定目标。

要使用ZMQ实现同步框架,您几乎可以只使用ZMQ;您可以将高水位线设置为1。不幸的是,这不是很好;您想要的是一个积极的queue长度为0。更不幸的是,将高水位线设置为0被ZMQ解释为无穷大

因此,唯一的选择是在ZMQ之上实现同步传输协议。这不是很难做到。两端之间的对话将类似于“我可以发送吗?”、“是的,你现在可以发送”、“确定了”、“我已经收到了”(两端都返回给调用方)(或者至少是编程版本)。这设置了所谓的执行渲染-两端都知道它们都达到了某个执行点

从技术上讲,您正在做的是采用ZeroMQ(参与者模型),并将其转化为更像通信顺序流程的东西

RPC

H