MQ - Concept
消息管道
在系统架构中,MQ 的定位是消息和管道,主要起到解耦上下游系统,数据缓存的作用,主要操作为生产和消息
架构
Broker
- Broker 本质上是一个进程
- 在实际部署过程中,通常一个物理节点只会起一个进程,在大部分情况下,Broker 表示一个节点
Topic
- 在大部分 MQ 中,Topic 都是用来组织分区关系的一个逻辑概念
- 通常情况下,一个 Topic 会包含多个分区
- 在 RabbitMQ 中,Topic 是指具体的一种主题模式
Partition
Queue / MessageQueue
- 在 MQ 中,分区、分片、Partition、Queue、MessageQueue 是一个概念,用来表示数据存储的最小单位
- 可以将消息写入到一个分区中,也可以将消息写入到 Topic 中,再分发到具体的某个分区
- 一个 Topic 通常会包含一个或多个分区
Producer
- 消息的发送方,即发送消息的客户端
Consumer
- 消息的接收方,即接收消息的客户端
ConsumerGroup
Subscription
- 一般情况下,MQ 中的 ConsumerGroup 和 Subscription 是同一概念
- 用来组织消费者和分区关系的逻辑概念,也可用于保存消费进度
Message
- 一条真实的业务数据,MQ 中的每条数据一般都叫做一条消息
Offset
ConsumerOffset / Cursor
- 指消费者消费分区的进度
- 每个消费者都会去消费分区,为了避免重复消费,都会保存消费者消费分区的进度信息
ACK
OffsetCommit
- 提交消费进度的操作,即数据消费成功后,提交当前的消费位点,确保不重复消费
Leader + Follower
- Leader 和 Follower 一般是分区维度副本的概念
- 一个分区一般会有多个副本,副本有主从概念,一般是一个主副本和多个从副本
Segment
- 指消息数据在底层具体存储时,分为多个文件存储时的文件,该文件叫做分区的数据段
- 如每超过 1G 的文件就新起一个文件来存储,即 Segment
- 几乎所有的 MQ 都有 Segment 的概念,如 Kafka 的 Segment,Pulsar 的 Ledger
StartOffset + EndOffset
- StartOffset 和 EndOffset 是分区维度的概念
- 数据是顺序写入分区的,一般从 0 位置开始往后写,此时 StartOffset 为 0
- 数据会过期,分区维度较早的数据会被清理,此时 StartOffset 会往后移,表示当前最早的有效数据的位点
- EndOffset 即最新的那条数据的写入位点
- StartOffset 和 EndOffset 是一直动态变化的
ACL
- 用来对集群中的资源进行权限控制,如控制 Topic 或 Partition 的读写操作等
功能
顺序消息
- Consumer 按 Producer 写入的顺序来消费消息
延时消息
定时消息
- Producer 发送消息到 Broker 时,设置该消息在多久后会被消费到,当时间到了,消息会被消费到
- 延时以 Broker 收到消息的时间为准,多久后消息能被 Consumer 消费
- 定时是指消息在设置的时间才能被看到
- 在技术上,延时和定时是一样的
事务消息
- 不同的 MQ 关于事务的定义,也是不太一样的
- 正常情况下,事务表示多个操作的原子性
- 在 MQ 中,一般指的是发送一批消息,要么同时成功,要么同时失败
消息重试
- Producer 重试 - 当消息发送失败后,可以设置重试策略
- Consumer 重试 - 当消费的消息处理失败后,会自动重试消费消息
消息回溯
- 消息可以被多次消费
- 某条消息消费成功后,该消息不会被删除,后续还能再重复消费到该消息
广播消费
- 一条消息可以被多个消费者消费
死信队列
- 当某条消息无法成功处理时,把该消息写入到一个死信队列中,继续处理后续消息
- 大部分情况下,死信队列在 Consumer 中使用
优先级队列
- 给 Partition 中消息设置权重,权重大的消息能够被优先消费到
- 大部分情况下,MQ 的消息处理是 FIFO 的规则
- 优先级是在消息维度设置的
消息过滤
- 给每条消息打上 Tag,在消费的时候根据 Tag 去消费消息
- 通过 Tag 去查询过滤消息 - 在 Consumer 端
TTL
- MQ 中的消息会在一定时间或者超过一定大小后会被删除
- MQ 的主要是缓冲作用,一般会要求消息在一定的策略后自动被清理
消息轨迹
- 记录一条消息从 Producer 发送、Broker 保存、Consumer 消费的全生命周期的流程信息
消息查询
- 根据某些信息查询到消息队列中的信息
- 根据消息 ID 或者消费位点来查询消息 - SQL Select
消息压缩
- Producer 发送消息的时候,是否支持将消息进行压缩,以节省物理资源
- 压缩可以在 Producer 完成,也可以在 Broker 完成,一般会在 Producer 完成
多租户
- 同一个集群存在逻辑隔离
- Namespace / Tenant
消息持久化
- 消息被发送到 Broker 后,会不会持久化存储
- 有些 MQ 为了保证性能,只会把消息存储在内存中,在节点重启后,数据会丢失
消息流控
- 对读写集群的消息进行限制
- 限流维度 - Topic / Partition / ConsumerGroup 等
选型
业务消息 - RocketMQ
流消息 - Kafka
RabbitMQ + RocketMQ
业务消息 - 及时性、更多的功能特性、消息可追踪
- RabbitMQ 和 RocketMQ 属于业务消息类的 MQ
- RabbitMQ 发展较早,RocketMQ 是新生的消息类的消息队列
- 从功能、集群化、稳定性、性能来看,RocketMQ 都优于 RabbitMQ - RocketMQ 替代 RabbitMQ
- 国内 - RocketMQ;国外 - RabbitMQ
Kafka
流消息 - 大流量、高吞吐
- Kafka 属于流场景的 MQ - 高吞吐、大流量
- 功能简单 - 不支持死信队列、延时消息等功能
- 非常稳定 + 吞吐性能非常高,能承担超大流量的业务场景 - 流场景下的消息管道的不二之选
Pulsar
- Pulsar 定位 - 消息和流融合
- 目标 - 满足所有消息和流的场景,同时满足功能和性能两方面的需求
- 发展时间较短,不太稳定,处于快速发展阶段
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.