Couchdb 消息总线&x2B;事件存储&x2B;PubSub

Couchdb 消息总线&x2B;事件存储&x2B;PubSub,couchdb,jms,amqp,mule,Couchdb,Jms,Amqp,Mule,我正在考虑构建一个具有许多数据源的应用程序,每个数据源都将事件放入我的系统中。事件具有定义良好的数据结构,可以使用JSON或XML进行编码 我希望能够保证事件被持久保存,并且事件被用作发布/订阅总线的一部分,每个事件可能有多个订阅者 对于数据库来说,可用性非常重要,即使它可以扩展到多个节点,分区容差也很重要,这样我就可以扩展可以存储事件的位置的数量。最终的一致性对我来说已经足够好了 我正在考虑使用JMS企业消息传递总线(例如)或AMQP企业消息传递总线(例如或) 但对于我的应用程序来说,如果我能

我正在考虑构建一个具有许多数据源的应用程序,每个数据源都将事件放入我的系统中。事件具有定义良好的数据结构,可以使用JSON或XML进行编码

我希望能够保证事件被持久保存,并且事件被用作发布/订阅总线的一部分,每个事件可能有多个订阅者

对于数据库来说,可用性非常重要,即使它可以扩展到多个节点,分区容差也很重要,这样我就可以扩展可以存储事件的位置的数量。最终的一致性对我来说已经足够好了

我正在考虑使用JMS企业消息传递总线(例如)或AMQP企业消息传递总线(例如或)

但对于我的应用程序来说,如果我能用CouchDB或类似的东西建立一个发布-订阅系统,它就可以解决我的问题,而不必集成企业消息总线和持久存储系统

哪一个更好?+扩展+负载平衡+某种PubSub机制,还是一个带有最终一致、可用、分区容限存储的显式PubSub消息传递系统?哪一个更容易设置、管理和操作?哪种解决方案在给定成本下具有高吞吐量?为什么?


另外,在选择我的技术之前,我还有什么问题要问吗?(顺便说一句,Java是服务器端和客户端语言)

我认为最好的解决方案是CouchDB+Jabber/XMPP服务器(ejabberd)+book:

  • JSON是CouchDB的自然存储机制
  • Jabber/XMPP服务器包括pubsub支持
  • 这本书是必读的
我在生产中使用的是一个。(不是Pub/Sub,所以我不认为这个答案是完整的) 目前(2011年6月),CouchDB作为消息传递基础具有巨大潜力:

  • 良好的数据持久性
  • 具备良好的集群能力(在局域网上,使用BigCoach或Lounge)
  • 良好的分布准备(数据中心之间,全球)
  • 好平台。尽管有下面列出的缺点,我还是喜欢CQS,因为我可以重用我的DB,它可以从Erlang、NodeJS和每个web浏览器中工作
  • \u将更改
    查询
  • 连续馈送,无需轮询即可即时交付
  • 网络关闭没有问题,请稍后从上一个位置重试
  • 不过,即使CouchDB中的低容量消息系统也需要仔细规划和维护。CouchDB可能是一个很棒的消息服务器。(它的灵感来源于处理大量电子邮件的Lotus notes。)

    但是,CouchDB面临以下挑战:

  • 仅追加数据库文件增长迅速
  • 请注意磁盘容量
  • 请注意磁盘i/o。压缩将读取和重新写入所有活动文档
  • 已删除的文档不会真正被删除。它们被标记为
    deleted=true
    并永久保存,即使在压缩之后!实际上,这对于CouchDB来说是非常好的,因为
    deleted
    操作将通过集群传播,即使网络中断一段时间
  • 传播(复制)删除是很好的,但是被删除文档的累积又如何呢?最终它将超越一切。解决方案是将它们从磁盘上删除。不幸的是,如果在查询map/reduce视图之前进行了两次或两次以上的清除,则该视图将完全重建自身。根据您的需要,这可能需要太多时间
  • 和往常一样,我们听到NoSQL数据库高喊“免费午餐!”,“免费午餐!”,而CouchDB说“你必须为此工作。”


    不幸的是,除非您有重新使用CouchDB的巨大压力,否则我会使用专用的消息传递平台。我对ejabberd作为消息传递平台以及与Google App Engine的通信有很好的经验。)

    虽然可以使用数据库作为消息队列系统的替代方案,但没有数据库是消息队列系统,甚至CouchDB也是如此。像AMQP这样的消息队列系统提供的不仅仅是消息的持久性,事实上,在RabbitMQ中,持久性只是一个隐藏的不可见服务,它负责处理您必须在CouchDB上自己处理的所有挑战


    好好看看RabbitMQ网站,那里有很多关于AMQP的信息以及如何利用它。他们收集了大量关于消息队列的文章和博客。

    +1对于Erlang消息总线。如果您已经有CouchDB,那么使用相同的语言部署另一台服务器会更容易。ejabberd的脱机消息支持也会有所帮助。如果我记得的话,ejabber可以在其mnesia数据库或MySQL或Postgres中保存脱机客户端的消息。感谢您对您的解决方案和观点的详细描述。你回答了一些问题,问了一些答案。