这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天
一、本堂课重点内容:
- 消息队列的前世今生
- 消息队列-Kafka
- 消息队列-BMQ
- 消息队列-RocketMQ
- 最佳实践
二、详细知识点介绍:
- Kafka:分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色
- RocketMQ:低延迟、强一致性、高性能、高可靠、万亿级别容量和灵活的可拓展性,在一些实时场景中运用较广
- Kafka:创建集群、新增Topic、编写生产者逻辑、编写消费者逻辑
- Topic:逻辑队列,不同的Topic可以建立不同的Topic
- Cluster:物理集群,每个集群中可以建立多个不同的Topic
- Producer:生产者,负责将业务消息发送到Topic中
- Consumer:消费者 ConsumerGroup:消费者组,不同组的消费者消费进度互不干涉
- Offset:消息在partition内的相对位置信息,可以理解为唯一ID,在partition内部严格递增
- Replica:每个分片有多个Replica,Leader Replica将会从ISR(同步中的副本,即与leader差距较小的follower)中选出。容灾,Leader对外服务,Follower异步去拉取leader的数据进行一个同步,如果leader挂掉了,可以将Follower提升成leader。
- 批量发送可以减少IO次数,从而加强发送能力
- 通过压缩,减小消息的大小
- 在每一个broker,都分布着不同Topic的不同分片
- 采用顺序写的方式进行写入,减少寻道带来的时间成本,以提高写入效率
- 通过offset二分查找小于目标offset的最大log,再遍历得到最终数据
- Broker 零拷贝 sendfile 将磁盘读到内核缓冲区后,直接转到socket buffer 进行网络发送
- 写入数据时 采用mmap文件映射 减少内存拷贝的次数
- 对一个Consumer Group,多个分片可以并发的消费,这样可以大大提高消费的效率。partition在consumer group中的分配问题可以通过手动分配和自动分配(rebalance)
- Kafka缺点:运维成本高;对于负载不均衡的场景,解决方案复杂;没有自己的缓存,完全依赖Page Cache
- BMQ:存算分离,云原生消息队列
- RocketMQ:Producer、Consumer、Broker。Kafka中的Partition在这里叫做ConsumerQueue
- Broker节点有Master和Slave的概念
- nameserver提供服务发现和路由
- Broker会将消息append到commitlog上面,然后按照不同的queue,重新dispatch到不同的consumer中(数据在commitlog中的索引),这样consumer就可以按照queue进行拉取消费
- RocketMQ提供事务消息 延迟消息 消费重试和死信队列
三、实践练习例子:
- 无
四、课后个人总结:
- 二分和kv是高效查找的常用手段
五、引用参考:
-
无