ActiveMQ - 创建队列/目标的最佳实践

时间:2016-05-24 11:03:29

标签: java jms activemq

在ActiveMQ中,我们是否应该为每种不同类型的事件创建单独的队列(目标),以便我们可以让不同的消费者处理此类事件?

或者我们应该发布一个通用事件,然后检查消费者中的事件以确定其类型并采取适当的行动。

例如:如果有两个事件UserCreatedEventUserActivatedEvent,我们应该有一个队列user_events_q,还是应该有两个队列user_created_events_q和{{1 }}?

拥有更多队列有什么不利之处吗?它需要更多资源吗?在这种情况下,典型的做法是什么?

2 个答案:

答案 0 :(得分:1)

肯定有多个队列将使用额外的资源,例如当对象被放入队列然后它保留在内存中(如果不使用持久队列)并且代理需要为每个队列维护一些元数据,但这是开销的可以忍受,因为为每个事件(在您的情况下)拥有一个专用队列提供了极大的灵活性和可扩展性。对于一个实例,引入了一个新事件,然后您可以简单地引入一个新的使用者来从该队列中读取,而不考虑现有的实现。

答案 1 :(得分:1)

您可能希望稍微限制队列数。也许保持低于100左右。如果您使用Hawt.io或Web控制台等工具 - 非常多的队列将无法正常工作。虽然理论上可以使用大量队列with some tweaking

单独队列的好处是:

  • 每个队列专用的死信队列
  • 授权是"每个队列"。
  • 策略可以应用于队列级别 - 即最大内存,DLQ策略等
  • 更简单的客户端代码。

您可以使用selectors在共享队列上复用事件类型。某个客户端只会通过查看某个消息属性来接收所需的消息。即EventType = 'StockUpdate'。这可能是减少队列数量的一种方法。

另一种方法是使用主题层次结构。它不会准确映射到队列,但可能是一个选项。假设您发布到不同的主题: StockUpdates.Nasdaq.AAPLStockUpdates.DeutscheBorse.VOW3

因此,如果您只想订阅纳斯达克,请使用StockUpdates.Nasdaq.>或者如果您只想要大众股票更新StockUpdates.DeutscheBorse.VOW3