RocketMQ源码分享笔记

RocketMQ源码分享笔记

2019, Mar 19    

前言

RocketMQ,是一种延时队列,主要的应用场景,就是消费者可以延时消费消息,比如在双11的时候,一瞬间有太多请求全部打在服务器上,服务器就会瞬间瘫痪,本文主要就是记录前辈分享的Rocket源码的时候笔记和一些感悟

主要功能

  • 负载均衡
  • 消费模式
  • 消费拉取
  • 消费进度反馈
  • 消费过滤
  • 延迟队列

分享主要内容笔记

打字速度有限,只能记录下简单的一些片段供参考

  • 有一个架构,轮询,可用性高,一致性要求没那么高
  • 消息的一个流程:生产者发了一个消息,到了breaker之后,到了commitlog。有一个G的大小,实际发送的大小,顺序写的,io性能会很好,会被放到消费者的queue里面 ,小了之后,总要发到某一个topic里面
  • 发一个消息的话,需要新建一个主题,需要制定一个queue的数量,每一个queue就是一个负载均衡,表示当前这个queue,消费到什么位置了。集群消息,一人拿一个。被负载的queue,同一个topic下的消息都是不同的
  • 消费者可以对同一个topic下面的某几个队列进行消费,多个不同的consumer
  • 设置min是核心线程数,是固定的,但是她的队列是无限的,所以这个地方没有什么用
  • 缓存超过10000个,会改变线程池的大小,会做对应的限制
  • msgListener就是传的一个回调
  • 会有一个offsetStore会存,存到本地和远程
  • 还有消息的消费逻辑,注册到客户端的,生成clientId
  • 封装了一些拉取消息的api,通过路由信息
  • worker发出请求,然后又一个线程池,来进行序列化和相应,消费的话会再七环到对应consumer的线程池
  • 有各种组件,然后讲讲启动之后,都做了哪些事情
  • 基本上都是通过定时消息去驱动的,很少是通过事件去驱动的,
  • 找nameserver,然后去找server的信息
  • 更新consumer消费的一个队列offset
  • 都不是实时的更新的,是每一个五秒钟才刷新一次的
  • 广播消费的,消费的queue是全部,订阅,不是分发,每一个rebalance里面,都处理了一个queue,实现了一个拍照
  • 如果没有存,就是首次消费,如果是last,就会从,rocket是经常清消息的,发消息,然后消费
  • 消费,就是拉取消息,就是放一条消息,就可以进行拉取,会先做一些验证,然后做一些限流,只不过限流是做一些delay,顺序消息,需要设置一下是不是第一次,然后获取订阅信息,然后调用对应的pullapi,然后去发一条消息,拉倒请求之后,就会有callback,去封装一下,找到了消息了,然后有一个真正的消息处理类
  • 处理的流程 如果全部消费成功了之后,就会找到maxOffset,如果没有的话,就会去更新最小的那一个,这就是整个的一个消费流程

自行延展

MQ是高并发系统的核心组件之一,能够提高业务效率和系统的稳定性,主流的MQ有Rocketmq、kafka、Rabbitmq

Rocketmq原理&最佳实践 主要对比如下
对比