上下文:操作系统:Linux(Ubuntu),语言:C(实际上是 Lua,但这不重要)。
我更喜欢基于 ZeroMQ 的解决方案,但会接受任何足够理智的东西。
注意:由于技术原因,我不能在这里使用 POSIX 信号。
我在一台机器(“工人”)上有几个相同的长期进程。
有时我需要通过命令行工具向每个进程传递控制消息。例子:
$ 命令和控制工人类型运行收集垃圾
这台机器上的每个工人都应该收到一条run-collect-garbage
消息。注意:如果解决方案能以某种方式适用于集群中所有机器上的所有工作人员,那将是完美的,但我可以自己编写这部分。
如果我要存储一些关于运行工作者的信息,这很容易做到。例如,将它们的 PID 保存在已知位置,并在已知路径上打开一个控制 Unix 域套接字,其中某处有 PID。或者打开 TCP 套接字并将主机和端口存储在某处。
但这需要仔细管理存储的信息——例如,如果工作进程突然死亡怎么办?(没有什么是无法管理的,但仍然需要大惊小怪。)此外,信息需要存储在某个地方,从而增加了额外的复杂性。
有没有一种以 PUB/SUB 风格执行此操作的好方法?也就是说,工作人员是订阅者,命令和控制工具是发布者,他们所知道的只是一个“频道 url”,可以说是用来获取消息的。
其他要求:
- 发送到控制通道的消息必须从轮询(选择,无论如何)循环中唤醒工作人员。
- 必须保证消息传递,并且必须到达每一个正在收听的工作人员。
- Worker 应该有一种方法可以在不阻塞的情况下监控消息——最好是通过上面提到的 poll/select/whatever 循环。
- 理想情况下,工作进程在某种意义上应该是“服务器”——他不应该为保持与“通道服务器”(如果有的话)持久连接等而烦恼——或者这应该由框架透明地完成。