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

Java ActiveMQ-创建队列/目标的最佳实践,java,jms,activemq,Java,Jms,Activemq,在ActiveMQ中,我们是否应该为每种不同类型的事件创建单独的队列(目的地),以便让不同的使用者处理此类事件 或者我们应该发布一个泛型事件,然后在consumer中检查该事件以确定其类型并采取适当的操作 例如:如果有两个事件,UserCreatedEvent和UserActivatedEvent,我们应该有一个队列user\u events\u q,还是应该有两个队列user\u created\u events\u q和user\u activated\u events\u q 有更多的队列

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

或者我们应该发布一个泛型事件,然后在consumer中检查该事件以确定其类型并采取适当的操作

例如:如果有两个事件,
UserCreatedEvent
UserActivatedEvent
,我们应该有一个队列
user\u events\u q
,还是应该有两个队列
user\u created\u events\u q
user\u activated\u events\u q


有更多的队列有什么缺点吗?是否需要更多资源?这种情况下的典型做法是什么?

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

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

您可能希望稍微限制队列的数量。也许可以保持在100左右。如果您使用Hawt.io或web控制台之类的工具,那么大量队列将无法正常工作。虽然理论上你可以使用大量的队列

单独队列的好部分是:

  • 每个队列都有一个专用的死信队列
  • 授权是“每个队列”
  • 策略可以应用于队列级别,即最大内存、DLQ策略等
  • 更简单的客户端代码
您可以使用在共享队列上多路复用事件类型。某个客户端只会通过查看某个消息属性来接收它需要的消息。例如,
EventType='StockUpdate'
。这可能是减少队列数量的一种方法

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


因此,如果您只想订阅纳斯达克,请使用
StockUpdates.Nasdaq.>
或者如果您只想订阅大众汽车的股票更新,
StockUpdates.DeutscheBorse.VOW3
,您可能想稍微限制排队的数量。也许可以保持在100左右。如果您使用Hawt.io或web控制台之类的工具,那么大量队列将无法正常工作。虽然理论上你可以使用大量的队列

单独队列的好部分是:

  • 每个队列都有一个专用的死信队列
  • 授权是“每个队列”
  • 策略可以应用于队列级别,即最大内存、DLQ策略等
  • 更简单的客户端代码
您可以使用在共享队列上多路复用事件类型。某个客户端只会通过查看某个消息属性来接收它需要的消息。例如,
EventType='StockUpdate'
。这可能是减少队列数量的一种方法

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

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