ActiveMQ - 创建 queues/destinations 的最佳实践
ActiveMQ - Best practice for creating queues/destinations
在 ActiveMQ 中,我们是否应该为每种不同类型的事件创建单独的队列(目的地),以便我们可以让不同的消费者处理此类事件?
或者我们应该发布一个通用事件,然后检查消费者中的事件以确定其类型并采取适当的行动。
例如:如果有两个事件,UserCreatedEvent
和 UserActivatedEvent
,我们应该有一个队列 user_events_q
,还是应该有两个队列 user_created_events_q
和 user_activated_events_q
?
多排队有什么坏处吗?会需要更多资源吗?这种场景的典型做法是什么?
肯定有多个队列会使用额外的资源,比如当对象被放入队列然后它保留在内存中(如果不使用持久队列)并且代理需要为每个队列维护一些元数据,但这是开销可以忍受,因为每个事件都有一个专用队列(在您的情况下)提供了极大的灵活性和可扩展性。例如,引入了一个新事件,那么您可以简单地引入一个新的消费者来从该队列中读取数据,而不考虑现有的实现。
您可能想稍微限制队列的数量。也许将其保持在 100 左右以下。如果您使用 Hawt.io 或 Web 控制台之类的工具 - 非常多的队列将无法很好地工作。虽然理论上你可以使用大量队列也许 with some tweaking。
单独队列的优点是:
- 每个队列一个专用的死信队列
- 授权为"per queue".
- 可以在队列级别应用策略 - 即最大内存、DLQ 策略等。
- 更简单的客户端代码。
您可以使用 selectors 在共享队列上多路复用事件类型。某个客户端只会通过查看某些消息 属性 来接收它需要的消息。 IE。 EventType = 'StockUpdate'
。这可能是减少队列数量的一种方法。
另一种方法是改用主题层次结构。它不完全映射到队列,但可能是一个选项。假设您发布到不同的主题:
StockUpdates.Nasdaq.AAPL
或 StockUpdates.DeutscheBorse.VOW3
.
因此,如果您只想订阅纳斯达克,请使用 StockUpdates.Nasdaq.>
,或者如果您只想订阅大众汽车股票更新,请使用 StockUpdates.DeutscheBorse.VOW3
。
在 ActiveMQ 中,我们是否应该为每种不同类型的事件创建单独的队列(目的地),以便我们可以让不同的消费者处理此类事件?
或者我们应该发布一个通用事件,然后检查消费者中的事件以确定其类型并采取适当的行动。
例如:如果有两个事件,UserCreatedEvent
和 UserActivatedEvent
,我们应该有一个队列 user_events_q
,还是应该有两个队列 user_created_events_q
和 user_activated_events_q
?
多排队有什么坏处吗?会需要更多资源吗?这种场景的典型做法是什么?
肯定有多个队列会使用额外的资源,比如当对象被放入队列然后它保留在内存中(如果不使用持久队列)并且代理需要为每个队列维护一些元数据,但这是开销可以忍受,因为每个事件都有一个专用队列(在您的情况下)提供了极大的灵活性和可扩展性。例如,引入了一个新事件,那么您可以简单地引入一个新的消费者来从该队列中读取数据,而不考虑现有的实现。
您可能想稍微限制队列的数量。也许将其保持在 100 左右以下。如果您使用 Hawt.io 或 Web 控制台之类的工具 - 非常多的队列将无法很好地工作。虽然理论上你可以使用大量队列也许 with some tweaking。
单独队列的优点是:
- 每个队列一个专用的死信队列
- 授权为"per queue".
- 可以在队列级别应用策略 - 即最大内存、DLQ 策略等。
- 更简单的客户端代码。
您可以使用 selectors 在共享队列上多路复用事件类型。某个客户端只会通过查看某些消息 属性 来接收它需要的消息。 IE。 EventType = 'StockUpdate'
。这可能是减少队列数量的一种方法。
另一种方法是改用主题层次结构。它不完全映射到队列,但可能是一个选项。假设您发布到不同的主题:
StockUpdates.Nasdaq.AAPL
或 StockUpdates.DeutscheBorse.VOW3
.
因此,如果您只想订阅纳斯达克,请使用 StockUpdates.Nasdaq.>
,或者如果您只想订阅大众汽车股票更新,请使用 StockUpdates.DeutscheBorse.VOW3
。