PUB / SUB包含短期发布者和长期订阅者

时间:2011-04-23 15:05:42

标签: linux ipc zeromq

上下文:操作系统: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循环。
  • 理想情况下,工作进程在某种意义上应该是“服务器” - 他不应该担心保持与“通道服务器”(如果有的话)持久性等的连接 - 或者这应该由框架透明地完成。

4 个答案:

答案 0 :(得分:4)

通常这样的模式需要发布者的代理,即您发送到立即接受传递的代理,然后可靠地转发给最终订阅者工作者。 ZeroMQ指南涵盖了实现此目的的几种不同方法。

http://zguide.zeromq.org/page:all

答案 1 :(得分:2)

根据你的要求,史蒂夫的建议似乎最简单:运行一个监听两个已知套接字的守护进程 - 工作者连接到它,命令工具推送到它,重新分配给连接的工作者。

通过有效地提名其中一名工人,你可以做一些可能有用的事情。例如,在启动时,worker会尝试绑定()一个PUB ipc:// socket,可以访问某个地方,比如tmp。赢得bind()的第二个IPC作为PULL套接字,并在其正常职责之上充当转发器设备,其他连接()到原始IPC。命令行工具connect()s到第二个IPC,并推送它的消息。风险就是胜利者死亡,留下一个锁定的文件。您可以在命令行工具中识别它,重新绑定然后休眠(以允许建立连接)。不过,这一切都有点复杂,我想我会选择代理!

答案 2 :(得分:0)

我认为你所描述的内容与设备/监督实施相吻合。

Gearman是一个伟大的任务队列管理器,并且supervisord将允许您确保进程全部正在运行。它也是基于TCP的,所以你可以让客户/工人在不同的机器上。

http://gearman.org/

http://supervisord.org/

我最近设置了多个gearmand节点,链接到多个worker,因此没有单点故障

编辑:抱歉 - 我的不好,我刚刚重读,发现这可能不太理想。

Redis有一些漂亮而简单的pub / sub功能,我还没有使用过,但听起来很有希望。

答案 3 :(得分:0)

使用多播PUB / SUB。您必须确保将pgm选项编译到ZeroMQ发行版中(man 7 zmq_pgm)。