主从站体系结构中有关故障转移的活动MQ待处理消息

时间:2018-06-28 21:24:37

标签: java apache-camel jms activemq failover

背景:

我们具有用于活动MQ的主(AMQ1)/从属(AMQ2)配置。
我们使用故障转移部署了多个应用程序,其中一些应用程序将发布/使用,而某些应用程序将使用/发布JSM消息。

其中有一个APPLICATION1,它每30秒发布消息(例如1000条消息)(我们有一个触发器来从数据库中提取记录,并一次又一次地发布和更新DB记录状态)到主题A。 在TOPIC A上具有使用者的另一个APPLICATION2一次消耗并存储在另一个数据库中。

故障转移:(tcp:// AMQ1:61616,tcp:// AMQ2:61616)?jms.prefetchPolicy.queuePrefetch = 1&timeout = 5000

技术细节: -作为bitronix的事务管理器,以确保2PC受到保护。
-Spring Boot应用程序1.3.X -Active MQ 5.14.X -Camel版本2.16.X,应用程序使用java config,我们使用Pooled Connection Factory创建Camel JmsComponent(camel routs)。

问题: 部署APPLICATION2应用程序后,它将创建AMQ用户,例如ID_Cosnumer-1001。在APPLICATION1发布消息时,APPLICATION2正在使用,而2PC工作正常,我们不会丢失任何消息,也看不到任何重复的消息。
当AMQ Master-AMQ1发生故障转移,AMQ2成为主节点且AMQ1成为从属节点时,问题就开始了。在此过程中,将为APPLICATION2创建另一个使用方ID_Cosnumer-2002的使用者,并且不会终止ID_Cosnumer-1001。两者都可以在AMQ浏览器使用者部分中看到。

  • 问题1:因此,一些运行中的消息处于待处理状态(可能与ID_Cosnumer-1001相关联),未被APPLICATION2占用,因此我们错过了这些事务,如何克服这个问题?
    • 问题2:随机地,可能是再次发生故障转移时(当主服务器切换时),这些消息被消耗掉了。由于此消息处于乱序状态。
    • 问题3::故障转移是否经常发生?为什么会发生?
    • 所有新消息都可以使用,没有任何问题。

在此先感谢大家的宝贵建议。

1 个答案:

答案 0 :(得分:0)

听起来您想要比直接主题更好的交付保证。使用持久订阅者,或查看虚拟主题(产生主题,从队列使用)。这将改善事务性行为(消耗时回滚消息),并且与没有持久订阅者的主题相比,队列具有更好的排序保证。

ref Virtual Topics