RocketMQ——集群机制
NameServer集群
由于所有broker定时向NameServer注册信息,以及NameServer自带的心跳检测,所以NameServer不需要实现同步机制,全由broker集群主动参与所有集群注册相同的信息;
Broker集群
每个Broker与NameServer集群中的所有节点建立长连接,定时注册Topic信息到所有NameServer
单机模式
单机,一台宕机直接拜拜;如果消息还没未写入磁盘,重启会后丢失
主从配对
Broker与slave配对是通过指定相同的brokerName参数来配对
MasterBroker:master的brokerId必须为0
SlaveBroker:非0表示Slave
一主多从模式
主宕机了容易导致可以消费消息,但不可以写消息;
多主多从模式
多主部署时,相当于分片.消息会均衡的分散在个台broker上,不是副本冗余哦;配置文件 集群名称一致,brokerId=0 相当于(主),brokerName不一致
RocketMQ——主从复制模式
主从结构意味着,数据采用同步或异步的方式进行消息复制
同步写模式(同步写,必须主备都写成功,才向应用返回成功,允许消费)
优点:数据不服务都无单点,Master 宕机情况下,消息无延迟,服务可用性不数据可用性都非常高
缺点:性能比异步复制模式略低,大约低 10%左右
异步写模式(异步则主备有短暂消息延迟(毫秒级))
优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,因为 Master 宕机后,消费者仍然可以从 Slave 消费,此过程对应用透明。不需要人工干预。性能同多 Master 模式几乎一样。
缺点:Master 宕机,磁盘损坏情况,会丢失少量消息;Master成功内存写入消息,但未同步给备用且master的本地磁盘,导致消息丢失;Master成功删除内存消息,但未同步给备用且删除master的本地磁盘导致重复消费
RocketMQ——主从独特特点
引入目的
当master消息堆积的内容默认超过物理内存的40%,则消息读取则由从服务器来接管,实现消息的读写分离,避免主服务IO抖动严重
同步过程
从服务器开启一个定时任务,定时从主服务器同步消息消费进度
不切换
主从同步不具备主从切换功能,即当主节点宕机后,从不会接管消息发送,但可以提供消息读取;利用docker自动重启
RocketMQ——自带业务处理(整体)
(1)RocketMQ业务处理器层
Broker端对消息进行读取和写入的业务逻辑入口,这一层主要包含了业务逻辑相关处理操作(根据解析RemotingCommand中的RequestCode来区分具体的业务操作类型,进而执行不同的业务处理流程),比如前置的检查和校验步骤、构造MessageExtBrokerInner对象、decode反序列化、构造Response返回对象等;
(2)RocketMQ数据存储组件层
该层主要是RocketMQ的存储核心类—DefaultMessageStore,其为RocketMQ消息数据文件的访问入口,通过该类的“putMessage()”和“getMessage()”方法完成对CommitLog消息存储的日志数据文件进行读写操作(具体的读写访问操作还是依赖下一层中CommitLog对象模型提供的方法);另外,在该组件初始化时候,还会启动很多存储相关的后台服务线程,包括
MappedFile预分配服务线程:AllocateMappedFileService
回放存储消息服务线程:ReputMessageService
Broker主从同步高可用服务线程:HAService
消息存储统计服务线程:StoreStatsService
索引文件服务线程:IndexService
RocketMQ——消息持久原理(整体)
(3)RocketMQ存储逻辑对象层
该层主要包含了RocketMQ数据文件存储直接相关的三个模型类IndexFile、ConsumerQueue和CommitLog。
IndexFile:为索引数据文件提供访问服务
ConsumerQueue:为逻辑消息队列提供访问服务
CommitLog:则为消息存储的日志数据文件提供访问服务。这三个模型类也是构成了RocketMQ存储层的整体结构(对于这三个模型类的深入分析将放在后续篇幅中);
(4)封装的文件内存映射层
RocketMQ主要采用JDK
NIO中的MappedByteBuffer和FileChannel,两种方式完成数据文件的读写。
MappedByteBuffer:将内存映射磁盘文件的方式完成对大文件的读写,在RocketMQ中将该类封装成MappedFile类。种Mmap的方式减少了传统IO将磁盘文件数据在操作系统内核地址空间的缓冲区和用户应用程序地址空间的缓冲区之间来回进行拷贝的性能开销单个IndexFile文件大小约为400M、 单个ConsumerQueue文件大小约5.72M 单个CommitLog文件大小为1G)
RocketMQ——消息消费原理(细节)