关于ZeroMQ中同步套接字的困惑

时间:2017-12-24 00:11:50

标签: asynchronous zeromq synchronous

这可能看起来是一个愚蠢的问题,但我对ZeroMQ关于REQ and REP等同步套接字的术语感到困惑。

根据我的理解,当客户端发送消息然后它阻塞时发生同步通信,直到响应到达。如果ZeroMQ实现了同步通信,则只有.send()方法足以用于同步套接字。

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

这是真的吗?

在这种情况下,有没有直接的方法来使用ZeroMQ实现同步通信?

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

2 个答案:

答案 0 :(得分:1)

让我们从第一步开始,忘记关于套接字的所有知识。

ZeroMQ更像是一种思考分布式系统(类似多代理)以及如何使用这种智能信令/消息传递框架设计软件的概念。

这是ZeroMQ的核心目标,允许设计师继续在应用领域进行思考,让所有低级别的脏工作实际操作,而不需要很多设计师。需要照顾。

如果刚刚开始使用ZeroMQ,可以在讨论详细信息之前享受short read about a ZeroMQ global view first,

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

  • 鉴于本地 Context() 实例是一个数据抽取引擎,并考虑到 REQ/REP 可扩展的正式通信原型模式,这个故事现在实际上是一个关于分布式有限状态自动机网络的故事。

  • 本地进程,只运行分布式REQ/REP通信原型的一端,无权影响远程进程接收或不接收从本地进程传递到ZeroMQ传递服务的消息以公平的信念对待入侵的接收者。本地进程对远程进程的影响越小。意图完全回应,所以欢迎分布式多智能体游戏领域。

REQ REP 正式行为都必须符合{local> {local>分布式模式} - 预期的行为 - REQ首先询问REP答案,以便保持合同承诺。关键是,这种行为是在一对节点之间分配和分配的,还有一些情况,当网络事件可能使分布式FSA陷入不可救药的相互僵局时(可能会在此发现更多帖子经常)。

因此,您的本地REQ代码必须.send() - 并且没有义务在REP - .recv( zmq.NOBLOCK ) - 或.poll()之前没有做任何合理的事情。 (根本没有任何人对远程节点存在任何保证,类似地,必须准备好预测并处理所有情况,远程方将永远不会响应,因此出现了许多新的挑战从分布式多代理生态系统的性质来看。

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

也可以运行相当多的共存ZeroMQ连接,以便对每个和任何形式的多代理连接进行优先级排序和专门化。分布式系统设计中的交互,甚至用于设计故障恢复和类似的高级健壮性概念,其中每个交互的异步性质避免了与远程(甚至可能尚未存在)的任何协调或同步的需要代理,主要是一个自治实体,拥有它自己的控制域,所以再次,主要是异步的本地代理可能"期望",更少"影响&# 34;以任何其他形式,但试图发送"那里"一条消息"电报"。

是的,零,ZeroMQ是异步无代理信令/消息传递框架。

对于(几乎)同步通信,可以采取措施和措施来减少(主要是分布式的)异步控制循环 - 最好使用MCVE示例更新您的帖子,并详细说明您的内容是什么实现的特定目标。

答案 1 :(得分:1)

要使用ZMQ实现同步框架,您几乎只能使用ZMQ来完成它;你可以将高水位标记设为1.不幸的是,它并不完全;你想要的是队列长度为0.更不幸的是,将高水位线设置为0会被ZMQ解释为无穷大......

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

从技术上讲,你正在做的是采用ZeroMQ(演员模型)并将其变成更像是沟通顺序进程的东西。

<强> RPC

说了这么多,从你的编辑中我想你可能会考虑Cap'n Proto。这是一个C ++序列化技术,有一个巧妙的RPC技巧。如果从一个RPC调用的返回是另一个RPC调用的输入,您可以提前将它们链接在一起(参见here)。