如何使用 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 ) 作为奖励点...
父进程启动几十个线程接收数据(最多几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 ) 作为奖励点...