kafka 如何做到1秒发布百万级条消息
kafak 提供的生产端的API发布消息到一个 topic 或者多个 topic 的一个分区(保证消息的顺序性)或多个分区(并行处理,不能保证消息的顺序性)。topic 可以理解为数据的类别,是一个逻辑概念。
维护一个Topic中的分区log,以顺序追加的方式向各个分区中写入消,每一个分区都是不可变的消息队列,数据由 k , v 组成,k 是 offset :一个64位整型的唯一标识,offset代表了Topic分区中所有消息流中该消息的起始字节位置。 v 是就是实际的消息。
写入快
1.顺序写入(随机写入会增加寻址过程),批量发送写入磁盘。
2.降低字节复制带来的开销,producer,broker,comsumer 三者使用共享的二进制消息格式。
KAFKA这种消息队列在生产端和消费端分别采取的push和pull的方式,也就是你生产端可以认为KAFKA是个无底洞,有多少数据可以使劲往里面推送,消费端则是根据自己的消费能力,需要多少数据,你自己过来KAFKA这里拉取,KAFKA能保证只要这里有数据,消费端需要多少,都尽可以自己过来拿。
写出快
1.零拷贝 FileChannel.transferTo ,页缓存和sendfile组合,意味着KAFKA集群的消费者大多数都完全从缓存消费消息,而磁盘没有任何读取活动。假设一个Topic有多个消费者的情况, 并使用上面的零拷贝优化,数据被复制到页缓存中一次,并在每个消费上重复使用,而不是存储在存储器中,也不在每次读取时复制到用户空间。 这使得以接近网络连接限制的速度消费消息。
2.批量压缩,即将多个消息一起压缩而不是单个消息压缩。