消息队列续 | 青训营笔记

45 阅读3分钟

3.Broker如何找到消息(索引

image-20230811203557564

如何具体寻找

image-20230811203723080

找到了6,那么6的内部如下:

对于kafka文件结构来说,文件构建的是稀疏索引

image-20230811203823507

时间戳这个没懂?????

image-20230811204024486

4.Broker传统数据拷贝

image-20230811204126926

然后使用了零拷贝,sendfile实现 这里有mmap和sendfile NIC Buffer是网卡,参考【linux】图文并茂|彻底搞懂零拷贝(Zero-Copy)技术 - 知乎 (zhihu.com)

image-20230811204159720

Consumer

1、如何解决分区在消费者Group中的分配问题

  • 手动分配(写定,每个consumer消费哪一个分区完全由业务决定, 存在问题?? 1、容灾问题,一个consumer挂掉了,这个分区就没有处理了 2、重启问题。考虑到承载量,新加入机器consumer来处理分区,如果要分担分区A,B那么正在处理A,B的机器就需要先停掉。 优点:简单,因为提前写好了比较快
  • 自动分配 High level的消费(协调者 image-20230811211703588

Reblance(动态分配

这个解决了重启问题???

image-20230811212205407

最后有一个定时发送心跳,其实也就是保活机制。

小结

帮助kafka提高数据稳定性和高吞吐的性能

Producer:批量发送,数据压缩

Broker:顺序写,零拷贝,消息索引

Consumer:Reblance

存在的问题

  1. 数据复制问题 重启的时候操作如下: image-20230811212838658

为什么要回切,是为了保证按照原始负载均衡的leader分配,否则如果有业务需要不断重启,可能最后leader都被分配到了最后一个节点,那最后一个节点的压力就会很大。

替换、扩容,缩容也是这样的操作,有数据复制的消耗时间的问题,主要是这整个流程的耗时长

2.负载不均衡 image-20230811213247951

需要转移跟分片较高同一台机器的其他分片到其他机器,但这个转移又涉及到一个I/O问题,是一个死循环。

image-20230811213321637

BMQ

介绍:兼容kafka协议(生产者和消费者可以不用变,相较于kafka),存算分离(在kafka,broker上存储的数据拿下来,用另一种存储机构进行存储),云原生消息队列。

image-20230811214926640

controller,coordinator都独立出来了。分布式存储系统可以是HDFS。

写请求proxy不做处理,直接给Broker,读请求直接从proxy即刻,这像是读写分离状态,。同时存算分离,没有复制,直接修改一下路由即可,因此重启,替换,扩容,缩容是秒级操作。

HDFS写文件流程

HDFS用多个Datanode存储数据。随机选多个Datanode创建文件进行写入。

image-20230811233456111

image-20230811233720710

同一个分区又多个segment,在不同数据节点上。

跨境问题

这样写入会比较快,

image-20230811235550049

RocketMQ

主要用于低延时的场景

image-20230812000257262

image-20230812000314503