是的,有几种方法。
a)使用串联的单纯形原型: 的 PUSH/PULL 强> 写道和 的 PULL/PUSH 强> 读 b)使用串联的单纯形原型: 的 (X)PUB/(X)SUB 强> 写道和 的 (X)SUB/(X)PUB 强> 读
PUSH/PULL
PULL/PUSH
(X)PUB/(X)SUB
(X)SUB/(X)PUB
.recv()
.send()
好吧,这个观察更多地与实际的socket-archetype有关,其中一些确实需要一个强制性的两步(内部FSA-s内部硬连线)排序 的 .recv() 强> - 的 .send() 强> --...
那么,挑战就在这里开始:ZeroMQ自启动以来就被设计为主要零共享,以促进绩效和独立性。 Zen-of-Zero是一个有趣的设计原则 分布式系统 设计。
然而,最近的重新设计工作已经在API 4.2+中提出了实现ZeroMQ套接字接入点以实现线程安全的意愿(这违背了最初的原则 的 无共享 强> ),所以如果要朝着这个方向进行实验,你可能会到达领土,这是有效的,但代价是禅宗的衰落。
由于设计纯度,即使可能,也不应共享ZeroMQ套接字接入点。
更好地装备这样的类与另一对单纯 PUSH/PULL -s,如果你努力分离OOP问题,但是这种只读专用+只写专用套接字的头端必须处理案例,当一个“远程”(超出外部类 - 抽象边界)ZeroMQ Socket-archetype FSA及其设置和性能调整和错误状态以及“远程”类必须安排所有这些加上调解所有消息传输到本地ZeroMQ- socket(主要是为两个头端(专用)类隔离和隐藏)。
在任何情况下,都可以通过适当的设计保养。
一个想法:
... override def sendMessage( address: String, response: String ): Unit = { val inprocWriteSocket: ZMQ.Socket = context.createSocket( ZMQ.DEALER ) inprocWriteSocket.connect( "inproc://backend" ) ...
在源代码中似乎很容易,但忽略了实际的设置开销,并且还应该尊重没有套接字的事实( 的 inproc:// 强> -transport-class是一个特殊情况)获得RTO(Ready-To-Operate)在它内部实例化的非常微秒内 Context() ,越少完全 .connect() 在与远程交易对手进行所有握手之后进行-ed和RTO-ed,以便最好地预先设置SIG / MSG基础设施,并将其作为半持久通信层保持最佳状态,而不是任何特定的/即时启动的可组合/一次性......(资源生态学)
inproc://
Context()
.connect()
的 连接插座 强> 使用时将套接字连接到对等地址 zmq_connect() 随着 的 inproc:// 强> 传输时,端点应解释为标识要连接的名称的任意字符串。在4.0版之前,必须先通过将名称分配给与正在连接的套接字相同的MQ上下文中的至少一个套接字来创建名称。自版本4.0以来的顺序 zmq_bind() 和 zmq_connect() 没问题就像是 的 tcp:// 强> 运输类型。
zmq_connect()
zmq_bind()
tcp://
因此,如果您的部署不确定实际的localhost API版本,请注意执行正确的顺序 .bind() / .connect() ,否则 的 inproc:// 强> 管道不适合你。
.bind()