消息队列
消息队列(MQ),指保存消息的一个容器,本质是个队列。但这个队列,需要支持高吞吐、高并发,并且高可用
Kafka
分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥出色
RocketMQ
低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些实时场景运用较广
Pulsar
是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体、采用存算分离的架构设计
BMQ
和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换调对应Kafka集群
Kafka
使用场景
- 日志信息
- Metrics数据(程序运行过程中的状态实时分析)
- 用户行为 搜索、点赞、评论、收藏
使用
- 创建集群
- 新增Topic
- 编写生产者逻辑
- 编写消费者逻辑
基本概念
- Topic:逻辑队列,简单来说就是不同的业务场景就是不同的Topic
- Cluster:物理集群,每个集群可以建立多个不同的Topic
- Producer:生产者,负责将业务消息发送到Topic
- Consumer:消费者,负责消费Topic中的消息
- ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉
- Partition:Topic分区,不同的分区消息可以并发处理
- Offset:消息在Partition内的相对位置,可以理解为唯一ID,在Partition内部严格递增
- Replica:Partition 的副本,用来保障Partition的高可用性。有两个一个leader一个follower
- Broker:Kafka 集群由多个 Broker 组成,每个 Broker 是一个独立的 Kafka 服务器,负责存储和处理消息
零拷贝
零拷贝技术通过减少数据在内核空间和用户空间之间的拷贝次数,显著提高了 Kafka 的吞吐量和性能。
传统数据传输过程
- 应用程序读取数据: 应用程序从磁盘或网络读取数据,数据首先从磁盘或网络设备拷贝到内核缓冲区。
- 内核缓冲区到用户缓冲区:数据从内核缓冲区拷贝到用户空间的缓冲区,供应用程序使用。
- 用户缓冲区到内核缓冲区:应用程序处理完数据后,将数据从用户缓冲区拷贝回内核缓冲区,准备发送或写入磁盘。
- 内核缓冲区到网络或磁盘:数据从内核缓冲区拷贝到网络设备或磁盘设备,完成数据传输。
sendfile
sendfile 是一个系统调用,允许将数据从一个文件描述符直接传输到另一个文件描述符,而无需将数据拷贝到用户空间。
- Kafka Broker 从磁盘读取消息数据,数据首先从磁盘拷贝到内核缓冲区。
- Kafka Broker 调用 sendfile,将数据从内核缓冲区直接传输到网络设备,而无需将数据拷贝到用户空间。
mmap
mmap 是一种内存映射技术,允许将文件或设备映射到进程的地址空间,从而可以直接访问文件数据,而无需拷贝。
- Kafka Broker 调用 mmap,将消息数据文件映射到进程的地址空间。
- Kafka Broker 直接读写消息数据,内核负责将数据同步到磁盘或网络设备。