Zmq_Push 和 Zmq_Pull 套接字

Zmq_Push and Zmq_Pull sockets

我正在做一个项目,我在多个线程中使用单个 zmq_push 套接字,每个线程连续发送数据包。另一方面,我有一个 Zmq_Pull 套接字,它一直在接收....我希望这个过程更快,我通过 zmq push 发送数据包的应用程序很快,但我怀疑我的接收速度更快或不……还有一件事,每个发送数据的线程都是唯一的,基于每个线程数据,我在接收端的不同线程中处理……如何使这个过程更快。我相信我需要为每个线程单独完成此操作,而不是在接收端循环每个数据包...关于如何执行此操作的任何答案?

为了给你的接收方更多的吞吐量,添加多个 PULL 套接字,每个套接字都有自己的线程或自己的进程

然后创建一个带有 PULL 和 PUSH 套接字的 zmq_proxy 进程。这很简单,只有几行代码http://api.zeromq.org/4-3:zmq-proxy

  • 发件人将连接到代理的 PULL 套接字
  • 接收方将连接到代理的 PUSH 套接字
  • 负载将在一个非常简单的循环方案中进行平衡。
+----------+     +----------+        +----------+      +----------+
|          |     |          |        |          |      |          |
| PUSH     |     | PUSH     |        | PUSH     |      | PUSH     |
|          |     |          |        |          |      |          |
+------+---+     +---------++        +-+--------+      +--+-------+
       |                   |           |                  |
       |                   |           |                  |
       |                   |           |                  |
       |                   |           |                  |
       |                   |           |                  |
       |                   |           |                  |
       |                   v           v                  |
       |                                                  |
       |                   +------------+                 |
       |                   |            |                 |
       +-----------------> |   PULL     | <---------------+
                           |            |
                           +------------+
                           |   zmq_proxy|
                           +------------+
                           |     PUSH   |
      +--------------------+            +----------------+
      |                    +-----+------+                |
      |                          |                       |
      |                          |                       |
      |                          |                       |
      |                          |                       |
      |                          |                       |
+-----v----+               +-----v----+              +---v------+
|          |               |          |              |          |
|  PULL    |               |  PULL    |              |  PULL    |
|          |               |          |              |          |
+----------+               +----------+              +----------+


注意: 如果您想要更智能的负载平衡,您将需要使用像 ROUTER/DEALER 这样提供反馈的套接字。 http://zguide.zeromq.org/page:all#The-Load-Balancing-Pattern

Q: how to make this process faster?
A: We need both COMMUNICATIONs and PROCESSING faster

如果您觉得 ZeroMQ 的概念对您来说是新的并且在您未来的工作中掌握起来可能有点棘手,您可能想回顾一下本文中的关键概念特征

a) 总是可以通过实例化 core-engine 的 Context( nIoTHREADs )[ 来提高 Communications-related 处理能力=41=] 有 nIoTHREADs >> 1

b) 可以根据经过技术验证的需要,使每个 processing-thread off-loaded 通过非常有效设计的本地 inter-process 消息传递基础设施(从 thread-specific 处理到 off-load 的通信)使用从每个 processing-thread 到 "central"-[=63 的 protocol-stack-less inproc:// 通信通道=] Communicator(Context-instance(s) 可以在线程之间共享,而 Socket-instances 可能不会 - 这是 ZeroMQ Zen-of-Zero,设计使然)。这样,每个 processing-thread 都不会阻塞或隔离宝贵的资源,因此可用于 "central"-data-pumping Communicator 的更高容量,并且可以 "delegate" 与工作负载的通信相关部分"central"-data-pump,使用 processing-thread 中最轻松的 send-and-forget 理念,同时允许 Communicator 处理和管理所有潜在的 smart-features,例如 [=71] =] ACK/NACK 丢弃消息的信号,on-the-fly 服务容量扩展和每个性能调优工程师都会喜欢的许多类似功能。

c) 可以根据技术上的需要,通过使用 PULL-receivers 并使 PUSH-er 端简单地 .connect() 到每个 'em. The internal mechanics of the PUSH-side Context-instance will need well oiled ( well parametrised ) configuration for multiple outgoing IO-channels, yet, if the remote-side PULL-ers' 处理性能是阻塞,这增加了和可扩展pool-capacity 是要走的路 - 当然,显然不是 PULL 端资源已经与发件人并置在同一个 hardware-node 上的情况,两者都已经达到上限可用的处理能力(ZeroMQ 的思维方式总是倾向于分布式,而不是在单个本地 hardware/OS 上配置处理代理 - 这是 Zen-of-Zero 传播的自由和 的基础几乎 线性性能可扩展性。