前言
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原理&最佳实践 主要对比如下