深入浅出消息队列----【初始篇】
- 一、思考:为什么会出现 “消息队列”
- 二、RocketMQ 总览
- producer
- producer group
- nameSrv
- Broker
- Broker cluster
- consumer
- consumer group
- Topic
- Tag
本文仅是文章笔记,整理了原文章中重要的知识点、记录了个人的看法
文章来源:编程导航-鱼皮【yes哥深入浅出消息队列专栏】
一、思考:为什么会出现 “消息队列”
正常的消息流转应该像下面的图一样
我(yes)给鱼皮发送了一条消息,消息内容是 “放学后校门口见”。
但鱼皮可能很忙,没有及时的看到我的消息,但又不能让我的消息丢失。
所以就需要有个中转站来暂存这些消息,这样鱼皮不能及时处理消息,可以等空闲的时候再看这些消息,我也不需要在意鱼皮是否忙不忙了,只需要发消息就行了。
中转站除了存储我发送给鱼皮的消息外,还可能存储很多别的消息,比如蛇皮发送给猪皮的消息。
当消息越来越多后,一个中转站可能运转不过来了,就需要进行扩容了,中转站-2。
但随着中转站的增加,管理起来就不容易了,发消息的人和看消息的人用起来也不方便了。
比如,蛇皮这个人很倔,他只向中转站-2发消息,即使中转站-2消息爆满了,中转站-1空闲。
又或者,猪皮这个人很傻,他只会从中转站-1拿消息,从来不会去中转站-2看一下,导致他遗漏了很多消息。
更严重的情况,又一次中转站-1瘫痪了,所有人都停止工作了,因为所有人都不知道中转站-2的存在。
因此,需要一个看板,这个看板的作用是让大家知道有几个中转站,分别在哪里。
中转站会主动上传自己的信息给看板,让大家知晓中转站的存在。
发消息和看消息的人可以从看板上知晓中转站的信息,从而有选择的发送和接收消息。
渐渐的我跟鱼皮之间的消息越来越多了,我将一部分工作分给我的小弟yes-1,鱼皮也越来越忙了,他将找了他的小弟鱼皮-1、鱼皮-2来帮忙。
这样就大致了解了消息队列出现的原因,以及大致的组成。
但还是存在很多问题,比如:
- 鱼皮如何知晓这个消息是工作消息还是闲聊消息呢?如何让两个小弟的工作量平均呢?
- 我们虽然知道了中转站-1和中转站-2的存在,但是如何判断是将消息发送到中转站-1还是中转站-2呢?
- 如果中转站堆积了很多消息,如何让鱼皮快速的找到属于他的消息呢?
- …
上面是yes哥举的个消息队列的例子,其实在我们日常生活中,消息队列的模式也是普遍存在的,比如接收快递的快递驿站,快递被快递员放到快递驿站,我们去快递驿站取快递…
仔细想一想,这不就是消息队列的实际应用吗,固然,宇宙的进制的编程。
二、RocketMQ 总览
producer
生产者,就是消息的发送者。
将消息发送到 Broker
producer group
生产者组,用于标识一类生产者。
比如发送事务消息时,当一个生产者挂了后,broker 可以找到同一个生产组的另一个生产者来确认事务的情况。
nameSrv
名字服务,上面的例子把它看作成了一个看板,它实际上是一个路由注册中心。
Broker 会定时把自己的信息比如 IP 地址上传给 nameSrv。
这样生成和消费者从 nameSrv 上获取这些信息,从而顺利的发送和接收消息。
Broker
代理服务器,也就是我们说的消息中转站,负责消息的存储、投递、查询。
Broker cluster
代理服务器集群,单个服务是脆弱的,假设就一个 Broker,万一挂掉了,就不能正常发送、存储和消费了,所以企业中都会搭建集群保证稳定性。
集群可以是主主集群,即集群内部的 Broker 是等同的,同时对外提供服务。
也可以是主从集群,主 Broker 提供对外服务,从 Broker 同步主 Broker 的消息作为备份,当主 Broker 宕机,从 Broker 可以提供消费消息,一个主可以有多个从。
consumer
消费者,用来消费消息。
consumer group
消费者组。
消费者组这个概念很关键,比如现在一个有两个消费者组分别是鱼皮消费者组合猪皮消费者组。
那么两个消费者组之间的消息消费是互不干扰的。
换句话说就是,我发送了一条消息给 Broker,鱼皮消费者组可以看,猪皮消费者组也可以看。
这条消息被鱼皮消费者组消费了,不影响它再被猪皮消费者组消费。
对于一个组来说,消费的模式有集群消费和广播消费两种模式。
- 集群模式:生产者发送了4条消息,编号分别是A-D,鱼皮团队接收了这4条消息,实际上鱼皮收到了A、D,鱼皮-1收到了B、鱼皮-2收到了C,大家负载均衡地消费了4条消息。
- 广播模式:生产者发送了4条消息,编号分别是A-D,鱼皮团队接收了这4条消息,实际上是鱼皮收到了A、B、C、D,鱼皮-1收到了A、B、C、D,鱼皮-2收到了A、B、C、D,组内每个消费者组都收到了全部消息,这就是广播。
Topic
主题,可以认为是消息的分类。
关于足球的消息,发往足球主题,如 Topic-football。
关于篮球的消息,发往篮球主题,如 Topic-basketball。
这样就给消息分了类,对足球感兴趣的就订阅 Topic-football,对篮球感兴趣的就订阅 Topic-basketball,大家之间互不干扰。
Tag
Topic 已经给消息分了类,那么 Tag 相当于二级分类,可以精细化的区分消息。
比如有人对足球主题感兴趣,但只喜欢看梅西的相关消息,而有人只喜欢看 C 罗的消息。
那么发送消息是往足球主题发送的,但是也顺带上了 tag 信息来标记这个消息是梅西还是 C 罗的。
订阅了足球主题的消费组可以根据 tag 选择它们想要的消息,过滤不想要的消息。