2013-04-22 84 views
3

我目前有一个pub/sub系统正在运行,它允许客户端连接到一个中央消息路由守护进程,订阅一系列消息,然后开始喋喋不休。路由守护进程跟踪和维护每个用户感兴趣的消息(基于一个简单的标签),并在每个订户生成它们时传递相应的感兴趣消息。基本上,每个连接都被认为是潜在的发布者订户并且通常是,守护进程根据需要处理路由和传送。ZeroMQ分布模式

例如,三个客户端的所有连接,并订阅感兴趣的消息标记(S)(MT):

Client 1(C1) subscribes to MT => 123 
Client 2(C2) subscribes to MT => 123 & 456 
Client 3(C3) subscribes to MT => 123 & 456 & 789 

C1 produces MT 456: daemon delivers a copy to C2 and C3 
C2 produces MT 123: daemon delivers a copy to C1 and C3 (not self) 
C3 produces MT 999: daemon delivers it to none (nobody subscribed) 

ZeroMQ与同事进行讨论,并用它修补了几个后,想出了我不认为我看到了实施/替换我们目前拥有的系统的适当模式。此外,我想使用EPGM来利用多播增益,并消除当前拥有的基于TCP的守护进程,即中间的猴子。

有什么建议吗?

回答

2

可以使用ZeroMQ来设计这样的系统。基本上说,你可以创建一个守护进程绑定两个套接字:PULL从客户端接收消息和PUB发布消息。每个客户端 SUB插座和PUSH插座连接到服务器。 EPGM可能用于PUB/SUB套接字,但PUSH/PULL套接字仍然是TCP。

该设计的缺点是主题过滤和删除自己的消息必须手动完成。例如,您可以创建三个部分消息:

  1. 主题制作的
  2. ID
  3. 消息体

客户应阅读立即丢弃消息的尾部的消息部分是不感兴趣使用PUB/SUB消息信封在本指南的本节中详细介绍:http://zguide.zeromq.org/page:all#Pub-Sub-Message-Envelopes。客户端过滤不应该影响性能,因为所有的PGM数据包都必须传送到所有连接的接收器。

这种设计非常简单但相当有效。它不包括可靠性,高可用性,故障恢复和其他重要方面 - 所有这些都可以在ZeroMQ中使用,并且在指南中涵盖。可能ZeroMQ的最大特点是可以从简单的东西入手,并且可以根据需要添加功能,而不会造成痛苦和/或重大改写。

非常类似的东西(加状态的快照,可靠性等等)指导的一章“可靠的发布 - 订阅(克隆模式)”中描述:http://zguide.zeromq.org/page:all#toc119

顺便说一句,这也是可以设计的P2P系统中央守护进程只用作名称服务器,但它肯定会更复杂。

+0

谢谢,这是好东西。我试图采用epgm方法,并不确定我是否对zmq做了些愚蠢的事情,或者如果我在使用的服务器上存在MCAST环回问题。我确信我被困在了15年的车辙中(这是我编写pub/sub守护进程的时候),我错过了一些明显的东西。仍然不确定发生了什么问题,默认的TTL为1应该允许在同一个系统上使用通信,但我会继续插入。 – jbphelps 2013-04-24 00:39:55