消息队列| 青训营笔记

52 阅读2分钟

这是我参加第五届青训营伴学笔记创作活动第5天

  1. 业界消息队列对比
  • Kfafa:分布式的、分区的、多副本的日志提交服务。在吞吐场景下出色。
  • RooketMQ:低延迟、强一致、高性能、高可靠、容量亿万级、灵活可扩展性,在实际应用场景中应用较广
  • Pulsar:集消息、存储、轻量化函数式计算为一体,采用存储计算分离的架构设计。
  • BMQ:也是采用存储、计算分离,初期是承接高吞吐的离线业务场景逐步替代对应的Kafka集群
  1. 消息队列KAFAka的使用场景

image.png

  • 如何使用kfa
  • 创建集群
  • 增加topic(设置分片数量)
  • 编写生产者逻辑(引入的SDK、配置集群、topic参数,初始化生产者调用send方法将信息发送)
  • 编写消费者逻辑查(引入的SDK、配置集群、topic参数,初始化消费者调用poll方法将信息发送) 3.Kafa处理消息流程如下

image.png

  • topic:可以理解为不同业务场景就是不同的topic,是kafka中的逻辑队列
  • cluster:是kafka的物理集群,每个集群中都可以有不同的topic
  • Producer:是消息的生产端,负责将消息业务发送到topic中
  • Consumer:消息的消费端,负责消费已经发送到topic中的数据

4.kafka的框架

image.png

  • AooKeeper:该模块主要是存储集群中的元数据信息:比如副本等分配信息、controller计算好的方案

  • Broker表示kafka的节点

      • 消息的处理与保存
  • image.png 如何批量发送数据,通过对生产者产生的消息进行压缩处理,之后保存在集群中的每一个节点broker上

  • image.png

  • 在broker中保存的文件如下方式保存:每一个broker中分布着不同topic的不同分片

  • image.png

  • 按照磁盘的读取方式,将消息按照先来先写的方式进行写入在broker中

    • 2 消息的寻找与消费
  • Consumer发送FetchRequest请求消息数据,Broker将指定Offset出的数据,按照时间窗口和消息大小窗口发送给consumer

  • image.png

  • 查询数据文件根据Offset按照二分查找的方式进行:二分法找到小于目标Offset的最大索引位置,之后从当前位置遍历找到目标Offset,进而找到存储的数据文件

  • image.png

  • 获取数据

  • consumer从Broker中获取数据,通过sendfile方式从磁盘读到io的缓冲区中,通过read Buffer发送数据。在producer将数据保存在broker中时,采用mmap方式,实现快速写

  • image.png 3. - consumer接收数据 在consumer接受到数据后如何将partition对consumer联系起来 image.png

  • 解决方式一:

  • 手动分配,按照业务需求为consumer选择对应的partition

  • 解决方式二:

  • kafka有一个机制rebalance,可以为自动分配partition