我正在寻找构建一个包含许多数据源的应用程序,每个数据源都将事件放入我的系统。事件具有明确定义的数据结构,可以使用JSON或XML进行编码。
我希望能够保证事件被持久保存,并且事件被用作发布/订阅总线的一部分,每个事件可能有多个订阅者。
对于数据库,可用性非常重要,即使它扩展到多个节点,并且分区容差很重要,这样我可以扩展可以存储我的事件的位置数。最终的一致性对我来说已经足够了。
我在考虑使用JMS企业消息传递总线(例如Mule)或AMQP企业消息传递总线(例如RabbitMQ或ZeroMQ)。
但对于我的应用程序,似乎如果我可以使用CouchDB或类似的东西建立发布订阅系统,它将解决我的问题,而无需集成企业消息传递总线和持久存储系统。
哪个会更好,CouchDB +扩展+负载平衡+某种PubSub机制,或者是一个带有最终一致,可用,分区容忍存储的显式PubSub消息系统?哪一个更容易设置,管理和操作?对于给定的成本,哪种解决方案具有高吞吐量?为什么呢?
另外,在选择我的技术之前还有其他问题吗? (顺便说一句,Java是服务器端和客户端语言)。
答案 0 :(得分:6)
我在制作中使用了CouchDB message queue。 (这不是pub / sub,所以我不认为这个答案是完整的。)
目前(2011年6月),CouchDB作为消息传递基板具有巨大潜力:
_changes
查询
尽管如此,即使CouchDB中的低容量消息系统也需要仔细规划和维护。 CouchDB 可能是一个出色的消息服务器。 (它的灵感来自Lotus笔记,它处理高电子邮件量。)
然而,这些是CouchDB面临的挑战:
deleted=true
并且即使在压实之后也会永远保留!这实际上是关于CouchDB的非常好,因为deleted
操作将通过群集传播,即使网络停止运行一段时间。像往常一样,我们听到NoSQL数据库大喊“免费午餐!”,“免费午餐!”而CouchDB说“你将不得不为此工作。”
不幸的是,除非你有迫切需要重用CouchDB的压力,否则我会使用专用的消息传递平台。我在ejabberd作为消息传递平台以及与Google App Engine进行通信方面有过良好的体验。)
答案 1 :(得分:2)
我认为最好的解决方案是CouchDB + Jabber / XMPP服务器(ejabberd)+书:http://professionalxmpp.com
答案 2 :(得分:2)
虽然您可以使用数据库作为消息排队系统的替代方案,但是没有数据库是消息排队系统,甚至不是CouchDB。像AMQP这样的消息排队系统提供的不仅仅是消息的持久性,实际上使用RabbitMQ,持久性只是一个无形的服务,它可以解决您在CouchDB上必须处理的所有挑战。
仔细查看RabbitMQ网站,其中有大量关于AMQP的信息以及如何使用它。他们在收集有关消息排队的文章和博客方面做得很好。