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