最佳的发布/订阅“中间件”

9

我正在寻找一个好的开源基于网络的发布/订阅(观察者模式)库。目前我还没有找到满意的选择:

  • JMS - 只能用于Java,将消息内容视为二进制数据

  • NDDS - 价格昂贵,需要使用IDL

  • CORBA/ICE - 发布/订阅是建立在RPC之上的,CORBA API不直观

  • JBOSS/ESB - 不太熟悉

如果有这样一个软件包,它应该具备以下功能:

  • 基于网络

  • 能够识别有效载荷数据,用户不必担心大小端/序列化问题

  • 支持多种语言(最好包括C++、Ruby、Java和Python)

  • 无自动生成代码(不需要IDL!)

  • 直观易用的订阅/主题管理

出于兴趣,我已经创建了自己的库。您有什么想法吗?

9个回答

5

4
正如本帖中早期的一篇文章所指出的那样,你有一个选项是OpenSplice DDS,它是OMG DDS标准(与NDDS实现的相同标准)的开源实现。
OpenSplice DDS相对于您考虑的其他中间件的主要优点可以概括为:
- 性能 - 对QoS的丰富支持(持久性、容错性、时效性等) - 数据中心化(例如查询和过滤数据流的可能性)
我想了解的是,你对IDL有什么问题。DDS使用IDL作为语言无关的用户数据类型规范。但是DDS并不限于IDL,如果您喜欢,您可以使用XML。指定您的数据类型,并将其表示与特定的编程语言分离,其优势在于中间件可以:
(1)帮助您减轻序列化数据的负担,
(2)生成非常节省时间/空间的序列化,
(3)确保端到端类型安全,
(4)允许整个数据类型进行内容过滤(而不仅仅是JMS中的头文件),并且
(5)使各种编程语言之间的互操作性在线上成为可能(例如Java、C/C++、C#等)。
根据您设计的系统或应用程序,上述某些属性可能无用/不相关。在这种情况下,您只需生成一个或几个“DDS类型”,这是您序列化数据的容器。
如果您考虑JMS,它为您提供了5种不同的主题类型可用于发送数据。使用DDS时,您也可以做到相同的事情,但是您具有定义确切主题类型的灵活性。
最后,您可能需要查看有关Scala和DDS的此博客文章,以更长时间地探讨为什么类型和静态类型在分布式系统中特别好。
-AC

3
我们使用RTI DDS实现。它的成本是$$,但支持许多服务质量参数。
有一个名为OpenDDS的免费DDS实现,但我没有使用过。
如果目标语言是静态类型的,我不认为你可以避免预定义数据类型的需要。

2
我一直认为数据应该是XML格式,这样它就是半预定义的(通过模式),但不会与任何语言绑定。 - David

2

深入了解各种JMS实现。

它们大多不仅支持Java,还提供其他语言的客户端库。

Suns OpenMQ至少有一个C++接口,Apache ActiveMQ为许多常见语言提供客户端库。

在消息格式方面,它们通常与消息中间件本身无关。您可以定义自己的消息格式。您可以定义自己的XML模式并发送XML消息。如果您想要使用某个第三方库发送BER编码的ASN.1,则可以使用该库。或者使用JSON库格式化和解析数据。


1

我使用过三种消息队列:

  • IBM MQ Series - 价格太贵,而且难以使用。

  • Tico Rendezvous -(现在更名为EMS?)非常快,使用UDP,也可以不需要集中式服务器。这是我最喜欢的选项,但价格昂贵,需要支付维护费用。

  • ActiveMQ - 目前我正在使用它,但发现它经常崩溃。另外,因为它需要一些从Java移植的项目,如spring.net,所以我不能因其稳定性问题而推荐它。

我还尝试使用MSMQ来构建自己的发布/订阅系统,但由于它无法直接处理,你需要编写大量的代码。


TIBCO Rendezvous和TIBCO EMS是两个不同的产品。EMS是一个JMS提供程序,包括一个或多个中央消息服务器。Rendezvous是一个无连接的发布/订阅中间件,没有中央服务器。根据您的要求,这两个产品是互补的。 - scaganoff

1
您可能对 MUSCLE 库感兴趣(免责声明:我是它的作者,所以我可能有偏见)。我认为它符合您指定的所有标准。

https://public.msli.com/lcs/muscle/


0
IBM WebSphere MQ,如果您在企业级别上工作,许可证并不太昂贵。

1
OP 要求一个开源解决方案! - Alexander Vogt

0

还有OpenSplice DDS。这个与RTI的DDS类似,不同的是它是LGPL!

看看


1
OpenSplice的链接:http://www.opensplice.org/cgi-bin/twiki/view/Community/WebHome - tuergeist
他说:“没有自动生成的代码(没有IDLs!)” - tobsen

0

你可以看一下PubSubHubbub。它是Atom/RSS的扩展,通过Webhooks允许pubsub。接口是HTTP和XML,因此它与语言无关。现在Google Reader、FriendFeed和FeedBurner正在使用它,因此它的采用率越来越高。主要用例是博客等内容,但当然你可以有任何类型的有效负载。

我知道目前唯一的开源实现是this one,适用于Google AppEngine。他们说支持自托管即将推出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接