我正在考虑系统,该系统将通知多个消费者有关对象群体发生的事件。每个订阅者都应该能够订阅发生在零个或多个对象上的事件,多个订阅者应该能够接收有关发生在单个对象上的事件的信息。
我认为某些消息排队系统在这种情况下是合适的,但我不知道如何处理我将拥有数百万个对象的事实 - 对每个对象使用单独的主题听起来不太好[还是没事呢?]
你能否提出我应该采取的方法,甚至可能是一些合理的开源消息排队系统?
更多细节:
提前感谢您的反馈,并对有些模糊的问题表示抱歉!
答案 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,用于管理和监控RabbitMQ服务器 - 包括命令行工具和基于浏览器的用户界面 - 请参阅:http://www.rabbitmq.com/management.html。
在我一直在使用的项目中,我使用C#和两个不同的包装器EasyNetQ和Burrow.NET与RabbitMQ进行了沟通。两者都是RabbitMQ的优秀包装器,但我最终成为Burrow.NET的粉丝,因为它更容易和更明显地工作(没有很多魔法)并且提供了良好的灵活性来注入记录器,序列化器,等
我从未使用过您将要使用的对象数量 - 我已经与数千人(而不是数百万人)合作过。但是,无论我使用了多少个对象,RabbitMQ一直非常稳定,并且从未成为系统中错误的来源。
总而言之 - RabbitMQ易于使用和设置,支持AMQP,可以通过HTTP进行管理,也是我最喜欢的 - 它坚如磐石。
答案 1 :(得分:4)
分解主题以携带特定事件,例如“对象更新主题”“对象已删除”...因此,客户只需订阅他们感兴趣的基于事件的主题的“有限号:”。
在发布消息时将标头插入到消息中,并将智能放入客户端以将这些标头用作消息选择器。例如,客户端知道他感兴趣的对象列表 - 并说你用“id”标识对象 - id可以是标题,客户端将使用“id标题”来确定他是否感兴趣消息。
根据您是否需要,您可能还需要考虑确保有保证的交付,以确保客户端即使离线并稍后返回也会收到消息。
我推荐的顶级选项是ActiveMQ,RabbitMQ和Redis PUB SUB(还没有真正使用过redis pub-sub,请使用你的应有的稀释度)
的一些效果基准刚刚看到你只有少数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。