如何把开源项目用好,很大程度上是由学习路径决定的:
a. fork下来,起一个demo,上一个测试环境,遇到问题再去社区提问或找些实践文章;
b. 把官方文档通读一遍,理解下产品、特点和应用场景;
c. 先看一遍源代码,理解清楚其中的代码逻辑;
d. 看源代码太费劲,找本社区推荐的书系统的梳理下;
本文来自 Apache RocketMQ 的资深用户丁威,他和 MyCat 的核心开发者周继锋合著了《RocketMQ技术内幕:架构设计与实现原理》一书,目的是希望用图解的方式梳理 RocketMQ的核心原理,包括 RocketMQ Topic 的路由注册与剔除机制、消息发送高可用设计、消息存储文件设计、并发消息拉取与消息消费流程、主从同步(HA)、事务消息基本实现原理等,帮助开发者在使用 RocketMQ 的同时,还能对其核心原理了然于心。
Topic 的路由机制
介绍路由注册机制之前,先简单看下 RocketMQ 的整体架构:
Producer:消息生产者,用于向消息服务器发送消息;
NameServer:路由注册中心;
Broker:消息存储服务器;
Consumer:消息消费者,该流程图中未涉及;
联通性:
A.NameServer 之间互不通信,无法感知对方的存在。
B.Producer 生产者与 NameServer 集群中的一台服务器建立长连接,并持有整个 NameServer 集群的列表。
C.Broker 服务会与每台 NameServer 保持长连接。
Topic路由注册与剔除流程:
A.Broker 每30s向 NameServer 发送心跳包,心跳包中包含主题的路由信息(主题的读写队列数、操作权限等),NameServer 会通过 HashMap 更新 Topic 的路由信息,并记录最后一次收到 Broker 的时间戳。
B.NameServer 以每10s的频率清除已宕机的 Broker,NameServer 认为 Broker 宕机的依据是如果当前系统时间戳减去最后一次收到 Broker 心跳包的时间戳大于120s。
C.消息生产者以每30s的频率去拉取主题的路由信息,即消息生产者并不会立即感知 Broker 服务器的新增与删除。