3.Broker如何找到消息(索引
如何具体寻找
找到了6,那么6的内部如下:
对于kafka文件结构来说,文件构建的是稀疏索引。
时间戳这个没懂?????
4.Broker传统数据拷贝
然后使用了零拷贝,sendfile实现 这里有mmap和sendfile NIC Buffer是网卡,参考【linux】图文并茂|彻底搞懂零拷贝(Zero-Copy)技术 - 知乎 (zhihu.com)
Consumer
1、如何解决分区在消费者Group中的分配问题
- 手动分配(写定,每个consumer消费哪一个分区完全由业务决定, 存在问题?? 1、容灾问题,一个consumer挂掉了,这个分区就没有处理了 2、重启问题。考虑到承载量,新加入机器consumer来处理分区,如果要分担分区A,B那么正在处理A,B的机器就需要先停掉。 优点:简单,因为提前写好了比较快
- 自动分配 High level的消费(协调者
Reblance(动态分配
这个解决了重启问题???
最后有一个定时发送心跳,其实也就是保活机制。
小结
帮助kafka提高数据稳定性和高吞吐的性能
Producer:批量发送,数据压缩
Broker:顺序写,零拷贝,消息索引
Consumer:Reblance
存在的问题
- 数据复制问题 重启的时候操作如下:
为什么要回切,是为了保证按照原始负载均衡的leader分配,否则如果有业务需要不断重启,可能最后leader都被分配到了最后一个节点,那最后一个节点的压力就会很大。
替换、扩容,缩容也是这样的操作,有数据复制的消耗时间的问题,主要是这整个流程的耗时长
2.负载不均衡
需要转移跟分片较高同一台机器的其他分片到其他机器,但这个转移又涉及到一个I/O问题,是一个死循环。
BMQ
介绍:兼容kafka协议(生产者和消费者可以不用变,相较于kafka),存算分离(在kafka,broker上存储的数据拿下来,用另一种存储机构进行存储),云原生消息队列。
controller,coordinator都独立出来了。分布式存储系统可以是HDFS。
写请求proxy不做处理,直接给Broker,读请求直接从proxy即刻,这像是读写分离状态,。同时存算分离,没有复制,直接修改一下路由即可,因此重启,替换,扩容,缩容是秒级操作。
HDFS写文件流程
HDFS用多个Datanode存储数据。随机选多个Datanode创建文件进行写入。
同一个分区又多个segment,在不同数据节点上。
跨境问题
这样写入会比较快,
RocketMQ
主要用于低延时的场景