消息队列| 青训营笔记

48 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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是高效查找的常用手段

五、引用参考: