XXL-MQ 记一次由消费端部署模式而引起的思考

257 阅读2分钟

写在前面

     作者一直想深入的去研究一款消息队列MQ,例如 延迟消费,广播消息,失败重试等机制.
 奈何市面上的MQ中间件太多了,如kafka,activeMQ,rocketMQ....所以也一直在纠结该以哪款为入手点,对新人友好?
 想起作者曾深入的研究了xuxueli大佬的分布式调度系统(XXL-JOB),然后进入XXL社区,刚好发现了的另一个开源项目,即分布式消息队列(XXL-MQ).       
   
   简而言之四个字,以小见大,懂得都懂
   

突发奇想

今日灵光乍现,如果MQ消费端的部署模式如果是以下形式,会造成什么后果呢? 

wecom-temp-bdd293e9c8e0e878e95c3f5a2328d88b.png

即消费端是单机部署,但是内部topic的消费方法却有多个,如methdA(),methodB(),methodC()

  @topic=test
  methodA:(方法A消费)

  @topic=test
  methodB:(方法B消费)

  @topic=test
  methodC:(方法C消费)
  

个人思考

  1 如果我往队列发送一条消息hello world 那么methodA,methodB,methodC 三个方法都会执行吗?,即消息只能被消费一次?
  2 这样会保证消息的顺序性消费吗?即methodA-->methodB-->methodC 这样的消费过程? 
  3 这种部署模式一般允许吗?或者规范这样做吗?   

实际操作验证

 1 启动一个单机消费端,但是对于topic=topic_1的消费实现方法写了两个,DemoAMqConsumer,DemoBMqConsumer

wecom-temp-cd1f3511a3fec207b11f7782d7bbd024.png 企业微信截图_28cead17-f410-4d0b-8b95-46be22795ab0.png

 2 向topic=topic_1 顺序性发送五条消息测试消费1,测试消费2,测试消费3,测试消费4,测试消费5,来看一下具体消费情况,如下图    

企业微信截图_d98e629a-99ec-417a-829a-4c016fcd8bfd.png

问题解答

 1 一条消息,只会被其中一个方法执行消费,
   (ps底层通过数据库乐观锁进行,如methodA正消费消息时,会将消息status更新成 消费中,对于methodB,methodC来说不可消费)
   
 2  不可保证消息的顺序性
   (ps methodA,methodB,methodC 底层会有三个对应的线程去不断轮询获取MQ中心消息,线程存在竞争关系,因为导致不是顺序性,或者说是无序的)
   
 3 个人觉得这种模式一般不允许,否则会造成问题1,2,编码不规范等,属实是骚操作了!

End