Setup:
- 我们有一个Spring Boot应用程序,它正在从ActiveMQ Artemis JMS队列中读取消息。
- 消息正在 JPA 事务中处理。
- 当在 JPA 中出现触发回滚的异常时,它还会在 Artemis中触发 JMS 回滚,该回滚设置为具有重新传递延迟。
- 我们的应用程序在多个实例中并行运行,这在处理共享公共数据的多条消息时会导致乐观锁定问题。
问题:当并行处理 X 条消息并且存在乐观锁定问题时,只有 1 条消息通过,所有其他消息都会延迟重新调度。当重新传递发生时,与之前相同,X-1 消息将同时到达,因为延迟是相同的,并且只通过一个消息会导致相同的问题。
问:有谁知道一种方法来增加ActiveMQ Artemis的重新交付延迟时间的差异?
注意:我知道在ActiveMQ 5.x中有一个名为collisionAvoidanceFactor
的选项,但是ActiveMQ Artemis中缺少它。
正如你所注意到的,在ActiveMQ Artemis中没有等价的collisionAvoidanceFactor
。我知道没有办法以类似的方式修改重新交付延迟。有redelivery-delay-multiplier
,但这在重新交付中始终如一地强制执行,并且不会提供您正在寻找的差异。
您可以考虑使用消息分组,以便"共享公共数据的消息"由同一使用者串行使用,从而首先避免锁定问题。
在查看了实现此功能所需的条件后,我打开了ARTEMIS-2364。我将很快发送一个拉取请求,因此它可能会出现在Artemis的下一个版本(即2.10)中。