数百万主题的消息队列解决方案

时间:2012-08-27 18:39:08

标签: message-queue ibm-mq mq

我正在考虑系统,该系统将通知多个消费者有关对象群体发生的事件。每个订阅者都应该能够订阅发生在零个或多个对象上的事件,多个订阅者应该能够接收有关发生在单个对象上的事件的信息。

我认为某些消息排队系统在这种情况下是合适的,但我不知道如何处理我将拥有数百万个对象的事实 - 对每个对象使用单独的主题听起来不太好[还是没事呢?]

你能否提出我应该采取的方法,甚至可能是一些合理的开源消息排队系统?

更多细节:

  • 会有成千上万的订阅者[意味着他们不多],
  • 订阅者将分别订阅数十或数百个对象,
  • 将有大约5-20万个对象,
  • 事件本身不必携带任何信息。只是改变了该对象的信息就足够了,
  • 绝大多数对象永远不会订阅,
  • 事件以每秒几百个的最大速率发生,
  • 理想情况下服务器应该在linux下运行,能够通过http long-poll与生态系统的其余部分集成[使用节点js?码头下的延续?]。

提前感谢您的反馈,并对有些模糊的问题表示抱歉!

5 个答案:

答案 0 :(得分:6)

我强烈推荐RabbitMQ。我之前和之后的几个项目都使用过它,我认为它非常可靠并且提供了广泛的配置。基本上,RabbitMQ是open-source(Mozilla Public License(MPL))消息代理,它实现了Advanced Message Queuing Protocol (AMQP)标准。

如RabbitMQ网站上所述:

  

RabbitMQ可以在任何Erlang支持的平台上运行,从嵌入式系统到多核集群和基于云的服务器。

...意味着支持像Linux这样的操作系统。

此处有一个node.js库:https://github.com/squaremo/rabbit.js

它附带了一个基于HTTP的API,用于管理和监控Rab​​bitMQ服务器 - 包括命令行工具和基于浏览器的用户界面 - 请参阅:http://www.rabbitmq.com/management.html

在我一直在使用的项目中,我使用C#和两个不同的包装器EasyNetQBurrow.NET与RabbitMQ进行了沟通。两者都是RabbitMQ的优秀包装器,但我最终成为Burrow.NET的粉丝,因为它更容易和更明显地工作(没有很多魔法)并且提供了良好的灵活性来注入记录器,序列化器,等

我从未使用过您将要使用的对象数量 - 我已经与数千人(而不是数百万人)合作过。但是,无论我使用了多少个对象,RabbitMQ一直非常稳定,并且从未成为系统中错误的来源。

总而言之 - RabbitMQ易于使用和设置,支持AMQP,可以通过HTTP进行管理,也是我最喜欢的 - 它坚如磐石。

答案 1 :(得分:4)

分解主题以携带特定事件,例如“对象更新主题”“对象已删除”...因此,客户只需订阅他们感兴趣的基于事件的主题的“有限号:”。

在发布消息时将标头插入到消息中,并将智能放入客户端以将这些标头用作消息选择器。例如,客户端知道他感兴趣的对象列表 - 并说你用“id”标识对象 - id可以是标题,客户端将使用“id标题”来确定他是否感兴趣消息。

根据您是否需要,您可能还需要考虑确保有保证的交付,以确保客户端即使离线并稍后返回也会收到消息。

我推荐的顶级选项是ActiveMQ,RabbitMQ和Redis PUB SUB(还没有真正使用过redis pub-sub,请使用你的应有的稀释度)

最后,这里有RabbitMQRedis

的一些效果基准

刚刚看到你只有少数100条消息被推出/秒,这对activemq来说不是什么大问题,我一直在每秒处理240条消息的系统上使用Amq,它运行正常。我使用工作线程池来异步处理消息。如果你在java的土地上,看看像akka这样的框架,如果不坚持使用nodejs和围绕它的酷Eco系统。

答案 2 :(得分:2)

如果必须是开源的话我会去ActiveMQ,并且应用服务器为主题提供JMS功能,它有Ajax Support所以你可以从你的客户端访问它们

因此,您将使用JMS基础结构发布对象的主题,并can create topis as you need them

此外,通过使用Java应用程序服务器,您可以利用群集,负载平衡和其他高可用性功能(显然基于所选产品)

希望有所帮助!!!

答案 3 :(得分:2)

由于您的消息非常小,可能需要考虑专为小型设备设计的MQTT,尽管它在强大的设备上也能正常工作。关键考虑因素是低开销 - 基本上是一个小字节的2字节标题。由于您的音量,您可能无法使用任何简单或开源MQTT服务器。您可能需要像MessageSight这样的重型专用设备来处理您的音量。

有关您的应用程序的更多详细信息肯定会有所帮助。你也根本没有提到安全性。我认为你必须在这方面有一些需求。

答案 4 :(得分:1)

虽然不确定你的工作环境,但这里是我的位。您能否在系统中识别具有唯一ID的每个对象?如果是这样,您可以为每种事件类型设置一个主题。例如您想要跟踪对象删除事件,对象更新事件等。因此,您可以为每种事件类型设置主题。只要对象发生相应的事件,这些主题就会与对象的ID一起发布。这将限制您需要的主题。 问题的第二部分是不同的订阅者想要订阅不同的对象。因此,并非所有订阅者都对了解所有对象的事件感兴趣。此问题语句作用于消息传递框架提供的消息选择器(过滤)机制。所以基本上你需要寻找一个对特定对象感兴趣的用户。将此基础作为消息过滤机制。它可以是任何东西:对象类型,对象状态等。因此,最终您的系统将由每个事件类型的一个主题组成,其中某人发布事件消息:{object-type:object-id}信息。订阅者可以订阅任何主题并使用过滤条件。

如果上述解决方案满足,您可以使用任何消息传递解决方案:activeMQ,WMQ,RabbitMQ。