背景:
我们具有用于活动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浏览器使用者部分中看到。
在此先感谢大家的宝贵建议。
答案 0 :(得分:0)
听起来您想要比直接主题更好的交付保证。使用持久订阅者,或查看虚拟主题(产生主题,从队列使用)。这将改善事务性行为(消耗时回滚消息),并且与没有持久订阅者的主题相比,队列具有更好的排序保证。
ref Virtual Topics