我们有一个 MQ 队列,它从我们无法控制的外部系统接收消息。我们处理传入消息的系统是一个关键系统,无论如何都需要启动并运行 27x7。
处理传入消息的顺序也是不可协商的,这意味着我们需要完全按照它们到达的顺序来处理它们。
为了确保我们的系统 100% 可用,我们将系统部署到了一堆能够处理这些消息的物理机器上。
一旦消息到达我们的系统,我们就会建立一种机制来确保消息处理不会出现故障,同时还可以通过并行处理获得一些性能提升。对我们来说,性能提升是一件好事,但它是一个副作用,因为我们的主要目标是高可用性,同时确保正确的处理顺序。
我的想法是在每台机器上都有一个 MDB 能够处理传入的消息,但一次只有一个活跃的消费者。
我们使用 Webshere MQ 作为 JMS 提供者和 Webshere Application Server 8.5 来部署我们的应用程序。
多个消费者监听同一个队列的问题似乎不是一个可行的解决方案,因为当消息批量到达时,它们将被循环传递给所有消费者,并且无法控制这将如何发生以及消息很容易失序。
当我手动停止所有侦听器时,显然消息已按顺序处理。但是手动关闭和启动此类监听器绝对不是 HA 解决方案。
我们可以建立监控流程来检查系统的健康状况并根据需要关闭或启动它们,但这对我来说仍然太弱了。事实上,我们想要的是让所有侦听器都启动并运行,但只有一个侦听器接收消息。如果那个人因为某种原因宕机了,那么另一个坐在那里的人将变得活跃并开始处理消息。
最初我们考虑使用主题而不是队列,但这会带来其他问题,如下所示:
- 我们无法控制信息的来源
- 我们拥有的大量消息会给我们带来麻烦,因为我们的订阅者必须是持久的,当回来时必须处理大量未决消息
- 输入队列已经是集群的一部分,更改所有基础设施需要大量工作
无论如何,在我看来,它必须是一种现有的模式来适应这种情况。任何帮助,建议将不胜感激。
解决方案不必是特定的 MQ 解决方案,欢迎提出任何想法。
提前致谢