Kafka设计要点

来源:互联网 发布:杭州二手房成交数据 编辑:程序博客网 时间:2024/06/03 21:33

Kafka设计要点

1.持久化

(1) 利用OS的pagecache
不在进程中维护cache,而是直接写入磁盘,并定期刷新到磁盘。
使用进程cache的缺点:增加内存占用量;进程重启时要么重建cache(很耗时),要么以空cache运行(初始性能很差);加重编码负担,需要维护cache和磁盘上数据的一致性。

(2) 顺序写磁盘
没有使用B-Tree,因为B-Tree的复杂度是O(logn),而在磁盘上的B-Tree操作性能更差,每个磁盘一次只能做一次寻道,并行度受限。B-Tree读写要加锁,要么是页面锁要么是行级锁,否则就要对整棵树加锁。
使用顺序读写。顺序读写的复杂度是O(1)。顺序磁盘读写比随机内存读写还要快!在顺序读写时,读操作和写操作互相不需要加锁。

2.效率

(1) 批量传送
生产或消费消息时,批量传送消息(message set),减少网络往返时延。

(2) 二进制的消息格式
自定义的二进制消息格式

(3) 使用sendfile发送
将磁盘上的文件发送到网络上,原始的方法(read + send)需要4次copy(2次DMA copy + 2次CPU copy),2次系统调用,4次用户空间与内核空间的切换;linux kernel 2.1版本的sendfile需要3次copy(2次DMA copy + 1次CPU copy),1次系统调用,2次用户空间与内核空间的切换;linux kernel 2.4版本的sendfile只需要2次copy(2次DMA copy,没有CPU copy,所谓“零拷贝”)。https://www.ibm.com/developerworks/linux/library/j-zerocopy/

(4) 端到端的批量压缩
将多条消息一起压缩,而是每条消息单独压缩。消息从producer那里压缩,在broker上一直保持为压缩状态,直到被consumer取走,到达consumer那里才解压。

3.Producer

(1) 负载均衡
producer可以指定将消息发给哪个partition,有多种选择方式:hash, random, roudrobin,manual。

(2) 异步发送
Async Producer允许将消息放入缓冲区中,然后定期或定量将消息批量发送出去。它的优点是,如果多个producer生产消息的速度有差别,以缓冲区的方式可以将消息均匀一致地发送到网络上。

4.Consumer

consumer在消费消息时,先向broker发送一个fetch请求,指明要获取的消息的offset和数量,然后接收到一个响应,包含了批量的消息。其好处是consumer可以控制需要使用的消息的位置,进而可以重新消费。

0 0