如何使用 ZeroMQ 从父进程中的多个线程收集数据,同时保持解决方案尽可能简单和可扩展?

How to collect data from multiple threads in the parent process with ZeroMQ while keeping the solution both as simple & as scaleable as possible?

父进程启动几十个线程接收数据(最多几KB,每秒10个请求),必须收集在父进程的列表中过程。实现这一点的推荐方法是什么,它是高效的、异步的、非阻塞的,并且更容易以最少的开销实现?

ZeroMQ 指南建议使用 PAIR 套接字原型来协调线程,但是
如何扩展 那有 几百个线程?

没有免费的晚餐

即使某些营销人员提供了这一点,也不要认为这是理所当然的。

高效通常意味着复杂的资源处理。

最简单的实现通常与开销和高效的资源处理相抗衡。


最简单?

用亨利·福特爵士的观点,设计中不存在的组件就不会失败。

从这个意义上说,我们在这里努力不以编程方式控制任何超出最简单可能使用的智能 ZeroMQ 库的基本组件的东西:

Scenario SIMPLEST:

Rule a)

中央HQ单元(无论是线程还是完全隔离的进程).bind()-s 它是接收端口(预设为 ZMQ_SUBSCRIBE 行为原型)和 "subscribes" 它是 topic-filter 到 "everything" .setsockopt( ZMQ_SUBSCRIBE, "" ) 在它产生第一个 DAQ-{ thread | process },进一步参考为 DAQ-unit.

Rule b)

每个 DAQ-unit 只需 .connect()-s 到已经设置和就绪的端口HQ-unit with a unit-local socket access-port, pre-set as a ZMQ_PUBLISH behavior-archetype.

Rule c)

任何 DAQ-unit 只需 .send( ..., ZMQ_NOBLOCK )-s 根据需要它是通过消息的本地数据,它由 ZeroMQ 层在后台传送到 HQ-unit 的手中,在那里排队并可根据 HQ-unit 的意愿进行进一步处理。

Rule d)

HQ-unit 定期循环和 .poll( 1 )-s 用于收集消息的存在来自任何 DAQ-unit + .recv( ZMQ_NOBLOCK ) 以防任何此类存在。

就这些了
Asynchronous是。
Non-blocking是。
Simplest是。
Scaleable是。 几乎是线性的,直到 I/O-bound
(仍然可以进行一些调整来处理 stressed-I/O-operations ) 作为奖励点...