Skip to content

Commit 11b772f

Browse files
committed
docs:更新RMQ
1 parent 18b3a8c commit 11b772f

10 files changed

+2258
-70
lines changed

docs/.vuepress/config.js

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ module.exports = {
1717
"/": {
1818
lang: "zh-CN",
1919
title: "编程严选网",
20-
description: "Java、前端、大数据求职必备技能:大厂设计模式、DDD实践以及各大中台业务系统设计真实案例...程序员的一站式终身学习网站!"
20+
description: "Java、前端、大数据、AI应用开发求职必备技能:计算机基础,大厂设计模式、DDD以及各大中台和业务系统设计真实案例...软件工程师的一站式终身学习网站!"
2121
}
2222
},
2323
head: [
@@ -471,6 +471,14 @@ module.exports = {
471471
link: '/md/k8s/kubectl命令.md'
472472
}]
473473
},
474+
475+
{
476+
text: '监控',
477+
items: [{
478+
text: '00-你居然还去服务器上捞日志,搭个日志收集系统难道不香么!',
479+
link: '/md/monitor/00-你居然还去服务器上捞日志,搭个日志收集系统难道不香么!.md'
480+
}]
481+
},
474482
]
475483
},
476484
{
@@ -804,6 +812,7 @@ module.exports = {
804812
children: [
805813
"00-操作系统专栏大纲",
806814
"01-Linux命令",
815+
"02-进程管理",
807816
"超线程(Hyper-Threading),单指令多数据流(SIMD)技术"
808817
]
809818
}],
@@ -945,6 +954,16 @@ module.exports = {
945954
"kubectl命令",
946955
]
947956
}],
957+
958+
"/md/monitor/": [{
959+
title: "监控",
960+
collapsable: false,
961+
sidebarDepth: 0,
962+
children: [
963+
"00-你居然还去服务器上捞日志,搭个日志收集系统难道不香么!",
964+
"03-Loki 日志监控",
965+
]
966+
}],
948967
"/md/netty/": [{
949968
title: "Netty",
950969
collapsable: false,
@@ -973,7 +992,12 @@ module.exports = {
973992
sidebarDepth: 0,
974993
children: [
975994
"01-RocketMQ核心内容",
976-
"02-基于电商场景的高并发RocketMQ实战"
995+
"RocketMQ实战(01)-基本概念",
996+
"RocketMQ实战(02)-下载安装",
997+
"RocketMQ实战(03)-消息的有序性",
998+
"RocketMQ实战(04) - 订阅机制和定时消息",
999+
"RocketMQ实战(05) - 批量消息和事务消息",
1000+
"02-基于电商场景的高并发RocketMQ实战",
9771001
]
9781002
}
9791003
],
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
# RocketMQ实战(01)-基本概念
2+
3+
## 1 角色
4+
5+
### Producer
6+
消息生产者。
7+
8+
Producer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。
9+
10+
完全无状态,可集群部署。
11+
12+
Producer每隔30s(ClientConfig#pollNameServerInterval)
13+
14+
![](https://img-blog.csdnimg.cn/0b76a91e606a48c890dab6e573f44831.png)
15+
16+
从Name server获取所有topic队列的最新情况,即若Broker不可用,Producer最多30s就能感知,但期间内发往Broker的所有消息都失败了。
17+
18+
Producer每隔30s(ClientConfig#heartbeatBrokerInterval决定)
19+
20+
![](https://img-blog.csdnimg.cn/a0b3ee79f9cb42d0a173891558f4159a.png)
21+
22+
向所有关联的broker发送心跳,Broker每隔10s中扫描所有存活的连接,若Broker在2min内没收到心跳数据,则关闭与Producer的连接。
23+
24+
### Producer Group
25+
一类Producer的集合名称,这类Producer通常发送一类消息,且发送逻辑一致
26+
27+
### Consumer
28+
消费者。
29+
30+
Consumer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,定时向Master、Slave发送心跳。
31+
32+
Consumer既能从Master订阅消息,也能从Slave订阅消息,订阅规则由Broker配置决定。
33+
34+
Consumer每隔30s从Name server获取topic的最新队列情况,这意味着Broker不可用时,Consumer最多最需要30s才能感知。
35+
36+
Consumer每隔30s(ClientConfig#heartbeatBrokerInterval决定)向所有关联的broker发送心跳,Broker每隔10s扫描所有存活的连接,若某连接2min内没有发送心跳数据,则关闭连接;并向该Consumer Group的所有Consumer发出通知,Group内的Consumer重新分配队列,然后继续消费。
37+
38+
当Consumer得到master宕机通知后,转向slave消费,slave不能保证master的消息100%都同步过来了,会有少量消息丢失。还好一旦master恢复,未同步过去的消息会被最终消费。
39+
40+
### Consumer Group
41+
一类Consumer的集合名称,这类Consumer通常消费一类消息,且消费逻辑一致
42+
43+
## 2 高可用
44+
45+
### Broker
46+
47+
MQ服务,负责接收、分发消息。
48+
49+
消息中转角色,负责存储消息,转发消息,这里就是RocketMQ Server。
50+
51+
一个Master可多Slave,但一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的Broker Name,不同Broker Id来定义:
52+
53+
- BrokerId为0表示Master
54+
- 非0表示Slave
55+
56+
Master也可以部署多个。每个Broker与Name Server集群中的所有节点建立长连接:
57+
58+
- 定时(每隔30s)注册Topic信息到所有NameServer
59+
- Name Server定时(每隔10s)扫描所有存活broker的连接,若Name Server超过2min没有收到心跳,则Name Server断开与Broker的连接
60+
61+
#### 可用性
62+
63+
每个Broker节点都是主从架构:
64+
65+
##### 主从节点如何数据同步?
66+
每一个Slave-Broker节点都会去自己的Master节点那里拉取数据,以进行同步
67+
68+
##### 是否具有故障自动转移机制(即主节点宕机后,从节点自动成为主节点,无需人工介入)?
69+
70+
RocketMQ:
71+
72+
- 4.5前,若Master节点挂了,需手动选出一个Slave节点重新作为Master节点,效率低
73+
74+
- 4.5后,RocketMQ引入Dleger机制,采用Raft协议进行主从节点选举,实现了故障自动转移
75+
76+
![img](https://files.tpvlog.com/tpvlog/mq/20200220212759717.png)
77+
78+
### NameServer
79+
80+
无状态节点,节点之间无任何信息同步。负责MQ服务之间的协调。一个无状态的名称服务,可以集群部署,每一个broker启动的时候都会向名称服务器注册,主要是接收broker的注册,接收客户端的路由请求并返回路由信息。
81+
82+
NameServer-MQ服务注册发现中心,提供轻量级服务发现和路由。
83+
每个名称服务器记录完整的路由信息,提供相应读写服务,并支持快速存储扩展。
84+
85+
NameServer 充当路由信息提供者。生产者/消费者客户查找topic以查找相应broker列表。
86+
87+
## 3 可拓展
88+
89+
RocketMQ有可扩展性,因为每个Broker节点只保存整体数据的一部分,数据量越来越大时,可进行水平切分。
90+
91+
而RabbitMQ每个节点保存全量数据,数据量越来越大时,没法水平扩展,而RocketMQ通过数据分散集群的模式实现水平扩展。
92+
93+
### 3.1 Topic
94+
95+
消息的主题,定义并在服务端配置,Con按主题订阅,即消息分类,通常一个系统一个Topic。
96+
97+
一个Topic可有多个消息队列,一个Broker默认为每个Topic创建4个读队列、4个写队列。多个Broker组成一个集群,多个BrokerName一样的Broker组成主从架构。brokerId大于0表示从节点,brokerId等于0表示是主节点。
98+
99+
100+
101+
假设订单系统要往MQ发订单消息,就建立一个Topic,名为:topic_orderInfo,即一个包含了所有订单消息的数据集合:
102+
103+
- Pro发消息时,须指定好消息所属Topic
104+
- Con消费消息时,也需指定从哪个Topic获取消息
105+
106+
Broker存储消息时,每个Topic的所有消息数据可能分散在不同Broker节点,可在创建Topic时指定。假设topic_orderInfo包含900万条消息,指定分散在3个Broker节点,则每个节点就包含300万条消息数据:
107+
108+
![](https://files.tpvlog.com/tpvlog/mq/20200220212806938.png)
109+
110+
### 3.2 Tag
111+
112+
除了Topic外,还有一个Tag分类,区分在于 Topic 是一级分类,而 Tag 可以理解为是二级分类。
113+
114+
对消息进行过滤,理解为message的标记,同一业务不同目的的message可用相同topic(业务通用 topic)但
115+
可用不同tag(再细分)区分。
116+
117+
![](https://files.tpvlog.com/tpvlog/mq/20200224002046775.png)
118+
119+
### 3.3 Topic、Tag的最佳实践
120+
121+
#### 消息类型是否一致
122+
123+
如普通消息、事务消息、延时消息、顺序消息,不同消息类型用不同Topic,无法通过 Tag 进行区分
124+
125+
#### 业务是否相关联
126+
127+
无直接关联的消息,如淘宝交易消息,京东物流消息使用不同的 Topic 进行区分;而同样是天猫交易消息,电器类订单、女装类订单、化妆品类订单的消息可以用 Tag 进行区分;
128+
129+
#### 消息优先级是否一致
130+
131+
如同样是物流消息,盒马必须小时内送达,天猫超市 24 小时内送达,淘宝物流则相对会慢一些,不同优先级的消息用不同的 Topic 进行区分。
132+
133+
#### 消息量级是否相当
134+
135+
有些业务消息虽然量小但是实时性要求高,如果跟某些万亿量级的消息使用同一个 Topic,则有可能会因为过长的等待时间而“饿死”,此时需要将不同量级的消息进行拆分,使用不同的 Topic。
136+
137+
138+
139+
每个Broker都通过心跳告诉NameServer:我这里有哪些类型的Topic,每类Topic的哪些数据保存在我这。所以Pro才知道向哪个Broker发送消息,Con同理。
140+
141+
- Pro只能往Master-Broker发消息
142+
- Con既可从Master-Broker消费消息,也可从Slave-Broker消费消息
143+
144+
### Message
145+
146+
在生产者、消费者、服务器之间传递的消息,一个message必须属于一个Topic
147+
消息是要传递的信息。邮件中必须包含一个主题,该主题可以解释为要发送给你的信的地址。消息还可能具有可选标签和额外的键值对。例如,你可以为消息设置业务密钥,然后在代理服务器上查找消息以在开发过程中诊断问题。
148+
149+
### Offset
150+
偏移量,消费者拉取消息时需要知道上一次消费到了什么位置, 这一次从哪里开始
151+
152+
### Partition
153+
分区,Topic物理上的分组,一个Topic可以分为多个分区,每个分区是一一个有序的队列。
154+
分区中的每条消息都会给分配一个有序的ID,也就是偏移量,保证了顺序,消费的正确性
155+
156+
### key
157+
消息的KEY字段是为了唯一表示消息的,方便查问题,不是说必须设置,只是说设置为了方便开发和运维定位问题。
158+
如KEY可以是订单ID。
159+
160+
## 2 集群架构设计
161+
162+
![](https://img-blog.csdnimg.cn/20191025001711704.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
163+
164+
## remoting模块架构
165+
![](https://img-blog.csdnimg.cn/20201008002847207.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_16,color_FFFFFF,t_70#pic_center)
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# RocketMQ实战(02)-下载安装
2+
## 1 RocketMQ是什么
3+
4+
RocketMQ是由阿里捐赠给Apache的一款分布式、队列模型的开源消息中间件,经历了淘宝双十一的洗礼。
5+
6+
官网
7+
![](https://img-blog.csdnimg.cn/20191024132120332.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
8+
9+
## 2 RocketMQ的发展史
10+
11+
![](https://img-blog.csdnimg.cn/20191024131500529.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
12+
13+
2017开始发布即最新4.0.0版本![](https://img-blog.csdnimg.cn/20191024131837417.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_16,color_FFFFFF,t_70)
14+
15+
## 3 RocketMQ的特性
16+
17+
![](https://img-blog.csdnimg.cn/20191024131953983.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
18+
![](https://img-blog.csdnimg.cn/2019102413215576.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
19+
20+
## 5 下载与安装
21+
22+
进入下载页:
23+
24+
![](https://img-blog.csdnimg.cn/20191024233641247.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_16,color_FFFFFF,t_70)
25+
26+
下载
27+
![](https://img-blog.csdnimg.cn/20191024233733483.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_16,color_FFFFFF,t_70)
28+
29+
解压
30+
31+
启动namespace 默认4g![](https://img-blog.csdnimg.cn/2019102423483883.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
32+
33+
启动成功日志![](https://img-blog.csdnimg.cn/20191206001814128.png)
34+
35+
启动broke 默认8g
36+
37+
```bash
38+
nohup sh bin/mqbroker -n localhost:9876
39+
> ~/logs/rocketmqlogs/broker.log 2>&1 &
40+
```
41+
42+
![](https://img-blog.csdnimg.cn/20191206003703263.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70)
43+
44+
验证启动成功![](https://img-blog.csdnimg.cn/20191206003753507.png)![](https://img-blog.csdnimg.cn/20191024134451940.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_16,color_FFFFFF,t_70)
45+
46+
发消息
47+
48+
```bash
49+
export NAMESRV ADDR=localhost:9876
50+
bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
51+
```
52+
53+
收消息
54+
55+
```bash
56+
bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
57+
```
58+
59+
## 3 搭建
60+
61+
### 配置
62+
63+
runserver.sh 设置小点
64+
![](https://img-blog.csdnimg.cn/20191103145158719.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
65+
66+
runbroker.sh 设置小点
67+
![](https://img-blog.csdnimg.cn/20191103145746578.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
68+
69+
### 启动
70+
71+
```bash
72+
nohup sh bin/mqnamesrv > logs/namesrv.log 2>&1 &
73+
```
74+
75+
```bash
76+
nohup sh bin/mqbroker -n localhost:9876 >
77+
~/logs/rocketmqlogs/broker.log 2>&1 &
78+
```
79+
80+
启动报错
81+
![](https://img-blog.csdnimg.cn/20191103151015192.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
82+
83+
查看日志![](https://img-blog.csdnimg.cn/20191103150942509.png)
84+
85+
改启动文件,添加JAVA_HOME变量![](https://img-blog.csdnimg.cn/20191103154507585.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_16,color_FFFFFF,t_70)
86+
87+
启动成功
88+
![](https://img-blog.csdnimg.cn/20191103154618638.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
89+
启动broker
90+
91+
```bash
92+
nohup sh bin/mqbroker -c conf/broker.conf -n localhost:9876 > logs/broker.log 2>&1 &
93+
```
94+
95+
![](https://img-blog.csdnimg.cn/20191103155747201.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
96+
97+
## 6 引入客户端
98+
99+
```xml
100+
<dependency>
101+
<groupld>org.apache.rocketmq</groupld>
102+
<artifactld> rocketmq-client</artifactld>
103+
<version>4.3.0</version>
104+
</dependency>
105+
```
106+
107+
参考
108+
109+
- [RocketMQ官网](https://rocketmq.apache.org/docs/core-concept/)

0 commit comments

Comments
 (0)