第1章 阅读源码前的准备1, [5 G) J9 F2 _! X2 x
1.1 获取和调试RocketMQ的源码1
- s9 W3 o. E7 M( Q/ o9 Q5 D1.1.1 Eclipse获取RocketMQ源码1
7 E [) D' ?' B1 o: [$ [1.1.2 Eclipse调试RocketMQ源码8* a, ~ j7 ?/ c, j+ ]
1.1.3 IntelliJ IDEA获取RocketMQ源码14
4 q5 a4 X) W3 o( b1.1.4 IntelliJ IDEA调试RocketMQ源码165 b! ~( n8 H! O7 c/ b! b
1.2 RocketMQ源码的目录结构23! a; {+ ? n" M# A' ^" d, E
1.3 RocketMQ的设计理念和设计目标23
) ?! G( f9 W W1.3.1 设计理念23
/ _& F, |' l X9 v \7 V3 o1.3.2 设计目标24/ }2 m( I. @- i% A
1.4 本章小结26
第2章 RocketMQ路由中心NameServer27' a) y3 K4 r' N
2.1 NameServer架构设计27- }; s9 C+ K- Q
2.2 NameServer启动流程294 A g4 b) i( H0 Y- w2 ^, c) u% Y' ^
2.3 NameServer路由注册、故障剔除32
. g: }) ?+ r4 U2.3.1 路由元信息321 _ M" I) ^" D6 J
2.3.2 路由注册35
) n; Z8 Z# X2 n; f& H2.3.3 路由删除40
9 J4 i. f$ [/ \2.3.4 路由发现43
* h0 X/ c% W; m+ J' ^* e! ?2.4 本章小结44
第3章 RocketMQ消息发送46
6 y5 V$ b" J. Z" L% X3.1 漫谈RocketMQ消息发送46
% {: E- Q p4 x( v# E& S1 _0 a3.1.1 topic路由机制47
& ]0 ?! V5 l9 G/ I; a4 @% R6 {3.1.2 消息发送高可用设计48
5 B% Y+ Y! I# i9 U2 P3.2 认识RocketMQ消息50 g& Q8 ?8 H p: e$ j; t
3.3 生产者启动流程51
* o7 S4 v$ O5 |* P8 j9 S3 K+ f2 v3.3.1 初识DefaultMQProducer51
+ O6 ?5 `9 l) g3 L. Q2 a3.3.2 消息生产者启动流程54
& Z* J# ]' O% T# H; W" i3.4 消息发送基本流程55# h6 ^% r0 V/ E5 ?" e
3.4.1 消息长度验证56! C+ i( U$ R8 m
3.4.2 查找主题路由信息57
1 h, G5 |5 u6 k; _: r4 R8 z0 q0 F, x A3.4.3 选择消息队列60% R0 l8 g: T5 U* A8 W$ l6 E' L! r
3.4.4 消息发送65
! O4 x* Y3 Y$ C: m7 f! e: o3.5 批量消息发送72
3 p+ E a' A! W0 R2 c) i+ @2 K! k3.6 本章小结74
第4章 RocketMQ消息存储75( P7 p- V3 z' H: }" H' B, }* A
4.1 存储概要设计75+ z- ]' T0 ? C) }
4.1.1 RocketMQ存储文件的组织方式76) E+ A5 F/ a) W
4.1.2 内存映射80
' l {: u# P9 O4.1.3 灵活多变的刷盘策略81# Y! f+ J" d" R" l9 a
4.1.4 transientStorePoolEnable机制82
7 t0 t9 F% ]# [% [4 F/ C$ @& }6 V4.1.5 文件恢复机制829 z) E& b2 B; _) a+ Q I
4.2 初识消息存储830 s( R% V! i' J' t8 I' ~# z
4.3 消息发送存储流程84# j1 e# V- X y# I
4.4 存储文件组织与内存映射907 d3 _8 n2 {8 {/ k J' o* O
4.4.1 MappedFileQueue映射文件队列 90
+ a; {: \; N; T3 T4.4.2 MappedFile内存映射文件92
( v* j0 k$ K. H6 Y7 t. h+ G& O$ v9 g4.4.3 TransientStorePool99
& x1 G( t, D- U; n8 c9 `& X$ Q1 ~4.5 RocketMQ存储文件100" s. ^5 h* M/ Y, m+ {1 U
4.5.1 CommitLog文件101
* C! x3 ^5 K5 F& L# l9 V) U4.5.2 ConsumeQueue文件102) M3 ~7 ~1 w! p* H6 t
4.5.3 Index文件1061 V/ Y0 |. I r; _/ z: x2 O/ G( s
4.5.4 checkpoint文件110
/ U; B( b N1 s4.6 实时更新ConsumeQueue与Index文件111" P/ a' X: n6 K1 O
4.6.1 根据消息更新ConsumeQueue文件113; ?. w; O, t Z8 B+ j
4.6.2 根据消息更新Index文件114
$ v" ]) T: t* t+ ^4 P5 f \* q5 K4.7 ConsumeQueue与Index文件恢复115. D9 J2 O/ ]/ ^
4.7.1 Broker正常停止文件恢复1186 S4 x a0 g$ q/ T. q
4.7.2 Broker异常停止文件恢复120
. O: O! p$ C1 y# c/ M. k% ?, D4.8 文件刷盘机制1210 y5 K& J8 d* _9 b" d- o2 u/ J
4.8.1 Broker同步刷盘122
' u0 R; x' ~. O3 E4.8.2 Broker异步刷盘125
6 ]+ c1 t5 G6 y: H4.9 过期文件删除机制128
* n& a6 u: E6 {% q' B% Y4.10 同步双写132# B5 M( H, Y% C, b
4.11 本章小结136
第5章 RocketMQ消息消费137" j6 X$ x2 v$ N
5.1 RocketMQ消息消费概述1373 y* F Q' u0 |! D
5.1.1 消费队列负载机制与重平衡138
9 J9 v2 g% ~$ d& n$ a5.1.2 并发消费模型139
/ b/ m' B I/ Z) X5.1.3 消息消费进度反馈机制139' s* d% H6 l i# a
5.2 消息消费者初探141$ [2 E( s1 k6 C9 _
5.3 消费者启动流程143
( ~# `: c! V9 _9 Q0 \5.4 消息拉取1461 O2 `" ?3 A3 Y- V3 Z
5.4.1 PullMessageService实现机制1474 k7 T4 o2 m- y1 j& Y5 z6 _5 H
5.4.2 ProcessQueue实现机制1496 U5 s8 A. D6 q8 Z9 H
5.4.3 消息拉取基本流程150
) B2 A5 R: H) f. a; d) L5.5 消息队列负载与重新分布机制167
: |/ v p" k) i" w3 Q; t- L5.6 消息消费过程1753 q1 s& n' o8 q% l7 q- ^; e
5.6.1 消息消费176
1 p# R; X7 ^2 O8 P- i5.6.2 消息确认180
1 k% X1 q* \* S5 q5.6.3 消费进度管理184
h; k/ R! H% ?2 g5.7 定时消息机制1894 m/ L! W9 K. C* W
5.7.1 load()方法190. G/ @; c( ~4 C7 i
5.7.2 start()方法190
! c! W( ^0 n. j O( I2 |5.7.3 定时调度逻辑192* ]$ Q; g6 z3 s; `6 o" y
5.8 消息过滤机制194
2 T0 v) K8 p( M, Z$ K+ v5.9 顺序消息1998 Y$ a* u' J* @5 l& P, Q7 g
5.9.1 消息队列负载199
! v, O; G' e! t$ p, o; ?) B5.9.2 消息拉取200
/ Q' F' K1 [' O% f( x7 l# q5.9.3 消息消费201. E+ B: p" X+ m
5.9.4 消息队列锁实现208# j( F/ h, r3 n5 r3 j; }6 j
5.10 本章小结209
第6章 RocketMQ的ACL2108 q& Q7 t$ R- A8 ?/ F
6.1 什么是ACL210/ V. z1 F+ J5 {/ P2 M
6.2 如何使用ACL211
5 e) v* q1 ?( b: q6.2.1 Broker端开启ACL2116 J- ^0 m3 K1 ^& Y5 ^: c4 s
6.2.2 客户端使用ACL212
* i* l/ J3 X+ {7 h9 H/ C9 Q3 q6.3 ACL实现原理214
( X/ L8 t5 N0 k5 x6 Y! z3 @0 k6.3.1 Broker端ACL核心入口214
$ U% o3 G6 `5 e3 B" ?- ^6.3.2 PlainAccessValidator详解2162 v5 p3 q( [9 e! ]1 b0 v
6.3.3 PlainPermissionManager详解220; J. N8 E& C" S- _$ _, E1 C! u
6.3.4 AclClientRPCHook详解228) x8 ?9 x* @% Q8 K
6.4 本章小结231
第7章 RocketMQ主从同步机制232
5 V) U& X6 | h; _4 ~7.1 RocketMQ主从同步原理2325 d8 a, a. }# y3 y) B$ b
7.1.1 HAService整体工作机制233/ { Q& C0 o6 Y2 r* j# @
7.1.2 AcceptSocketService实现原理233
$ F% S$ l5 x+ }$ a9 x& H7.1.3 GroupTransferService实现原理2353 x1 }4 c7 k9 b1 p) l2 R
7.1.4 HAClient实现原理236
1 M2 q" M$ m6 ^+ F/ N7 T7.1.5 HAConnection实现原理239
( N4 j3 Y( b& C7.2 RocketMQ读写分离机制245- \( Z3 q& P3 O0 Z1 w: k; v0 y0 j. D
7.3 RocketMQ元数据同步248
, ]$ q5 y, c$ m. G0 j3 q. a( c5 z7.3.1 从节点主动同步元数据249
! G i! j' x* Z2 x/ n. S7.3.2 主节点消息拉取主动同步消费进度250
/ H; j7 c0 `2 \, N" ?7.4 本章小结251
第8章 RocketMQ消息轨迹252
# Y9 I/ ?; z1 V2 f1 {" l: E: {8.1 消息轨迹的引入目的和使用方法2523 w4 e1 M9 p. {5 ?' v
8.2 消息轨迹设计原理255
5 Q8 f+ g* \# }5 R3 i8.2.1 消息轨迹数据格式255
i0 U" q' w4 n4 H! X8.2.2 如何采集轨迹数据256
0 T" w ^# k$ O/ L8.2.3 如何存储消息轨迹数据2575 W. U2 R) P) b$ U7 ]7 P4 Y! }# F! \
8.3 消息轨迹实现原理257) s( \) o& {) u- a7 U9 ~# ~
8.3.1 寻找消息轨迹入口257
3 H1 X. Q" f% V9 Q# J6 x) W2 D9 Z8.3.2 消息发送轨迹数据259
6 D; k/ H% T6 Z! _4 p8.3.3 消息轨迹异步转发实现机制261
# B8 }! {( _" D) O8.4 本章小结265
第9章 RocketMQ主从切换266
2 E8 @6 G) u, M# g9.1 主从切换引入目的266" J% j% c3 p) d% u% M0 x
9.2 Raft协议简介267
" b$ K, ]* s' q+ o$ j3 _$ n9.2.1 Leader选举267
# J" A; I. Q3 ~8 r9.2.2 日志复制268
l/ S* ^' E" Q3 }9.3 RocketMQ DLedger主从切换之Leader选主269
. L: g" F: j6 H$ A* u0 E9.3.1 DLedgerLeaderElector核心类及核心属性2705 ?! ^ F% z9 B/ ], i( _1 \6 f
9.3.2 选举状态管理器初始化271
7 |" _2 t1 V2 u9.3.3 选举状态机状态流转273
5 g* f% z. x% F' f' c9.3.4 发送投票请求与处理投票请求280: |, y6 I/ E' C& ~' Y1 |4 j
9.3.5 发送心跳包与处理心跳包283
0 K6 U/ h' {; a9.4 RocketMQ DLedger主从切换之存储实现288
& R9 Y3 h. r: N$ p9.4.1 RocketMQ DLedger核心类及核心属性2883 I6 a, Z% ]$ @) h
9.4.2 RocketMQ DLedger数据存储协议290, d) m7 c- @; W* T& h
9.4.3 RocketMQ DLedger索引存储协议291) `. n7 y1 ?- S' e% j4 } ~% D
9.5 RocketMQ DLedger主从切换之日志追加291$ X+ k8 y9 C; p5 } N
9.5.1 日志追加流程概述291) o4 V6 L6 [/ k/ K$ h6 `. R" e3 d
9.5.2 判断Push队列是否已满293
! r, h; q& A7 Y$ q9.5.3 Leader节点日志存储293
! e, V* Y* q! O1 F+ u: H1 u9.5.4 Leader节点等待从节点日志复制响应ACK298
2 N9 p( d0 l( Z1 @& ]% X8 ]% @9.6 RocketMQ DLedger主从切换之日志复制299+ z% [+ J2 M8 Z s! o8 A6 W, C3 J
9.6.1 日志复制设计理念300, @4 @* t# B6 |% o
9.6.2 日志复制类设计体系301( o* q/ Z- n ^+ w
9.6.3 日志转发303& X b% ^& B1 n h0 ]" A
9.7 RocketMQ整合DLedger设计技巧与实现原理326; L7 F2 @# x. _5 ~) I$ [
9.7.1 数据存储兼容设计3270 q# R4 _( ~" V8 t; T, ~
9.7.2 数据存储兼容实现原理328
2 ?9 X f; _3 x! \+ i5 L* i9.7.3 主从切换元数据同步机制337
/ k! f7 T6 s& f3 R9.8 RocketMQ主从切换实战344
D( H9 ~: ?. e; I2 {: {9.8.1 主从切换核心配置属性344( m5 ]! ]- I8 N) J0 }
9.8.2 搭建主从同步环境344* v) C0 \- F7 B; t; O- c
9.8.3 主从同步集群升级到主从切换346; _: R" l6 a* t" Y0 ^
9.9 本章小结350
第10章 RocketMQ监控352% C K. v3 \2 O6 T9 k, l7 f
10.1 设计理念352
# Y, u! S6 p/ Y: l! u2 g% R, `10.2 实现原理353
$ D7 s' s/ Y* C. J8 X10.2.1 监控相关类图353
" e- Y* d! s# K* j% B10.2.2 监控原始数据采集流程3558 b4 h X1 p" `. J
10.3 监控数据采样机制3565 h6 O9 B1 @/ B/ t* D ?
10.3.1 监控数据采样356
9 @8 Z6 H" {5 u+ s! P- y10.3.2 根据采样计算统计指标357' o$ ?+ |4 c; q+ k& t. I+ u
10.4 如何采集监控指标359
5 y+ Z1 q5 G0 q+ ~6 N10.5 监控实战应用360$ u$ ?. }8 n' N5 ?* ]
10.6 本章小结365
第11章 RocketMQ实战366( T- X' L X) i
11.1 消息批量发送366
% S) V3 g5 i6 x; T0 H11.2 消息发送队列自选择367
1 @- k) w6 X$ J; ~11.3 消息过滤368
1 d( F. b& g4 ?7 c w11.3.1 TAG过滤模式3680 {0 v$ k8 e5 b. m2 A4 }
11.3.2 SQL过滤模式368' @7 J0 _+ o9 ]: G
11.3.3 类过滤模式369
3 l. b- {7 u) z5 o, P11.4 事务消息3715 Z) F- L8 L5 | R5 T6 `
11.5 Spring整合RocketMQ375: P! Z; u/ [4 b6 R+ E" ^
11.6 Spring Cloud整合RocketMQ376, a) W4 _0 M- z0 j/ {
11.7 RocketMQ监控与运维命令384- a: T+ k- v8 G' H$ M% [1 H" a
11.7.1 搭建RocketMQ监控平台rocketmq-console384
( u3 h& z& `: T( t+ C/ k11.7.2 RocketMQ管理命令387+ Q- m1 G2 u8 O/ G) ^( Z+ r( [4 I
11.8 应用场景分析423
6 L1 X0 C8 P% S7 H; _7 L5 E$ R. B11.9 实战案例424' m( R. f2 `) k B4 A) Q
11.9.1 RocketMQ集群线上故障缩容实战案例424& ?/ K; A+ E% v# \% e$ Q% r& O
11.9.2 RocketMQ在线扩容实战4272 c# F" {9 q" b. q# H3 l* e7 G
11.10 本章小结430$ `& l6 W/ L/ I) d) ~, P( K+ i+ w$ h. ]
附录 A 参数说明431
1 b, \7 l6 \0 R; j! p附录B RocketMQ各版本概述与升级建议436