概念及优劣势分析
与其他mq的区别:
- kafka其实是个流处理平台,只是提供了发布订阅和topic支持的功能
- 吞吐量高,单区有序,但整体不保证有序
- 能够通过历史日志消费历史数据
kafka为什么吞吐量大
主要以下四个原因:
日志检索
每条消息的组成:
一般情况磁盘读写比内存读写慢很多(随机读写方面)。但是kafka支持的顺序读写,可能比内存的读写效率还快。
consumer会从磁盘中读取。
Kafka 日志存储: https://www.jianshu.com/p/aecb6d9d8c1c
kafka系列——日志篇: https://blog.csdn.net/linbiaorui/article/details/84574458
查看index文件:
bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files ~/app/tmp/kafka-log/topic_test-0/00000000000000000000.index
//输出结果:
offset: 0 position: 0
查看log文件:
bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files ~/app/tmp/kafka-log/topic_test-0/00000000000000000000.log --print-data-log
//输出结果:
Starting offset: 0
baseOffset: 0 lastOffset: 3 count: 4 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false
position: 0 CreateTime: 1600015276125 size: 137 magic: 2 compresscodec: NONE crc: 32980716 isvalid: true
| offset: 0 CreateTime: 1600015276124 keysize: 5 valuesize: 7 sequence: -1 headerKeys: [] key: key-1 payload: value-1
| offset: 1 CreateTime: 1600015276124 keysize: 5 valuesize: 7 sequence: -1 headerKeys: [] key: key-2 payload: value-2
| offset: 2 CreateTime: 1600015276125 keysize: 5 valuesize: 7 sequence: -1 headerKeys: [] key: key-5 payload: value-5
| offset: 3 CreateTime: 1600015276125 keysize: 5 valuesize: 7 sequence: -1 headerKeys: [] key: key-6 payload: value-6
baseOffset: 4 lastOffset: 7 count: 4 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false
position: 137 CreateTime: 1600080591612 size: 137 magic: 2 compresscodec: NONE crc: 4029858374 isvalid: true
| offset: 4 CreateTime: 1600080591612 keysize: 5 valuesize: 7 sequence: -1 headerKeys: [] key: key-1 payload: value-1
| offset: 5 CreateTime: 1600080591612 keysize: 5 valuesize: 7 sequence: -1 headerKeys: [] key: key-2 payload: value-2
| offset: 6 CreateTime: 1600080591612 keysize: 5 valuesize: 7 sequence: -1 headerKeys: [] key: key-5 payload: value-5
| offset: 7 CreateTime: 1600080591612 keysize: 5 valuesize: 7 sequence: -1 headerKeys: [] key: key-6 payload: value-6
总结:找到index的offset,然后获得position,再去log文件中查找对应的position的相关数据。
sendfile零拷贝
总结:主要是应用和内核上下文的切换和拷贝次数方面的消耗大大降低。
分区
kafka中的topic中的内容可以被分为多分partition存在,每个partition又分为多个段segment,所以每次操作都是针对一小部分做操作,很轻便,并且增加并行操作的能力
批量发送
kafka允许进行批量发送消息,producter发送消息的时候,可以将消息缓存在本地,等到了固定条件发送到kafka
- 等消息大小到达BATCH_SIZE_CONFIG
- 一段时间发送一次
数据压缩
Kafka还支持对消息集合进行压缩,Producer可以通过GZIP或Snappy格式对消息集合进行压缩。
压缩的好处就是减少传输的数据量,减轻对网络传输的压力。
Producer压缩之后,在Consumer需进行解压,虽然增加了CPU的工作,但在对大数据处理上,瓶颈在网络上而不是CPU,所以这个成本很值得。