消息中间件activeMq ------------开篇(一)

本文分析了ActiveMQ 5.1版本中MessageCursor的一个bug,即在消息消费者速度变化时,MessageCursor无法自动调整状态的问题。并给出了具体的bug修复建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在后面的一系列文章中,我们将主要从如下几个方面来分析:    
   一、activeMQ的核心线程的功能和生命周期 
   二、消息存储的kaha实现的分析
   三、消息队列(Queue)实现的分析

   四、activeMQ的领域模型
   五、activeMQ中TCP通讯机制
   六、activeMQ的Cluster
   七、activeMQ中内存使用和管理
    作为开篇,首先我们非常尊重activeMQ的所有committer,它是个不错的软件作品,我们的分析是基于5.1版本的代码,就象任何事情一样,尤其是软件产品它的成熟是需要较长时间的过程,我们也会把分析中发现的5.1版本的bug于大家分享,下面我就以一个小bug作为整个activeMQ分析的开篇。 
    为了表述的方便,我们把这个bug叫做bug_1,为了讲清楚该bug,首先我会把相关的背景做一个介绍: 
    消息指针(Message cursor)是activeMQ里一个非常重要的核心类,它是提供某种优化消息存储的方法。消息中间件的实现一般都是当消息消费者准备好消费消息的时候,它会从持久化 
存储中一批一批的读取消息,并发送给消费者。消息指针维护着下一批待读取消息的相关位置信息。 
    消息指针在对不同的消息消费者时,它的内部处理机制也不一样: 
    1.当消费者跟得上消息生产者的时候,是快消费者。那这种时候Message cursor的内部过程如下图所示: 

    2.当消费者慢于消息生产者的时候,是慢消费者。那这种时候Message cursor的内部过程如下图所示:


    上面两种情况是能自动调整的,当一个消费者从快变成慢或从慢变成快的时候,Message cursor应该做自动的调整,在5.1里面这种自动调整有点小bug,它只能从快变成慢,反之则不行。具体bug原因应该是疏忽写错了,代码在类AbstractStoreCursor中的public final synchronized void remove()方法中的if (size==0 && isStarted() && cacheEnabled)这一行,只用把cacheEnabled改为useCache就可以了。(该bug已经被后续版本所修复) 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值