本篇博客主要参考:
《浅入浅出》-RocketMQ 敖丙
APACHE-RocketMQ Gitee RocketMQ官方文档
RocketMQ 实战与进阶 GitChat
又是好久没有写博客了,虽然可以找出无数个没有写的博客的理由,但是说到底,还是一个字“懒”。今天我终于吃了一颗治疗懒癌的药丸,决定写一篇博客。介绍什么好呢,思来想去,还是介绍下RocketMQ吧,毕竟写了30多篇博客,还没有好好写过关于MQ的博客呢。本篇博客比较基础,不涉及到源码分析,只是扫盲。
MQ有什么用
解耦
我觉得从某种角度来说,微服务促进了MQ的蓬勃发展,本来一个系统有N多个模块,所有模块都强耦合在一起,现在微服务了,一个模块就是一个系统,系统之间肯定需要交互,交互有三种常见的方法,一种是RPC,一种是HTTP,一种就是MQ了。
异步
原本一个业务分为N步,要一步一步处理,才能把最终的结果返回给用户,现在有了MQ,先把最关键的部分处理完毕,然后发送消息到MQ,直接返回给用户OK,至于后面的步骤在后台慢慢处理吧,真乃提升用户体验的神器。
削峰
某个接口的请求量突然飙升,势必会对应用服务器、数据库服务器造成很大的压力,现在有了MQ,来多少请求都不在怕的,后台慢慢处理呗。
RocketMQ简介
RocketMQ是用Java编写的,是阿里开源的消息中间件,吸收了Kafka很多优点。Kafka也是比较热门的消息中间件,不过Kafka是用Scala编写的,不利于Java程序员去阅读源码,也不利于Java程序员做一些定制化的开发。接触过Kafka的小伙伴都知道,要用好Kafka实属不易,相对来说,RocketMQ简单多了,而且RocketMQ有阿里加持,经历了N次双11的考验,比较适合国内互联网公司,所以国内使用RocketMQ的公司很多。
RocketMQ四大组件
图片来自https://gitee.com/mirrors/rocketmq/blob/master/docs/cn/architecture.md
可以看到RocketMQ主要有四个组件:
NameServer
- 无状态服务,注册中心,可集群部署,但是NameServer节点之间没有任何数据交互。
- Broker会以定时把Topic路由信息上报给所有的NameServer。Producer、Consumer会随机选择一个NameServer定时Topic更新路由信息。
- Topic路由信息在NameServer集群中采用最终一致性。
- 保证AP。
Broker
- RocketMQ的服务端,用于存储消息、分发消息。
- Broker会定时把自身拥有的所有的Topic路由信息上报给NameServer。
- Broker有两个角色:Master、Follower,Master承担读(消费消息)写(生产消息)操作,如果Master比较忙,或者不可用,Follower可以承担读操作。BrokerId=0,代表是Matser,BrokerId!=0,代表是Follower,需要注意的有两点:
其一,目前为止,BrokerId=1的Follower才可以承担读操作;
其二,只有较高版本的RocketMQ才支持当Master节点挂掉,Follower自动升级到Maste