-
消费方式
consumer采用pull(拉)模式从broker中读取数据。
push(推)模式,优点:消息传递速度快;缺点:消息发送者主动发送数据,消息接收者被动接收消息,很难适应消费速率不同的消费者。很容易造成consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而pull模式则可以根据consumer的消费能力以适当的速率消费消息。
pull模式:优点:可以根据consumer的消费能力以适当的速率消费消息;缺点:如果kafka没有数据,消费者可能会陷入循环中,一直返回空数据。针对这一点,Kafka的消费者在消费数据时会传入一个时长参数timeout,如果当前没有数据可供消费,consumer会等待一段时间之后再返回,这段时长即为timeout。
-
分区分配策略
一个consumer group中有多个consumer,一个 topic有多个partition,所以必然会涉及到partition的分配问题,即确定那个partition由哪个consumer来消费。
Kafka有两种分配策略,一是roundrobin,一是range。kafka默认采用roundrobin
roundrobin:即轮询,把partition分别依次发往cousumer。例如partition有(1,2,3,4,5,6,7),consumer有(A,B,C),则分配方式为 A(1,4,7);B(2,5);C(3,6),如果还有其他topic分区,依然如此分配,consumer中最多差一个。分配比较均匀
range:即分块,把partition分块分别发往cousumer。例如partition有(1,2,3,4,5,6,7),consumer有(A,B,C),则分配可能为 (3,2,2)即 A(1,2,3);B(4,5);C(6,7),但是,当多个topic分区时,依然如此分配,则A中每次都会分到三个分区,会导致数据倾斜,分配不均。
-
offset的维护
由于consumer在消费过程中可能会出现断电宕机等故障,consumer恢复后,需要从故障前的位置的继续消费,所以consumer需要实时记录自己消费到了哪个offset,以便故障恢复后继续消费。Kafka 0.9版本之前,consumer默认将offset保存在Zookeeper中,从0.9版本开始,consumer默认将offset保存在Kafka一个内置的topic中,该topic为__consumer_offsets。
-
Kafka 高效读写数据
-
顺序写磁盘
Kafka的producer生产数据,要写入到log文件中,写的过程是一直追加到文件末端,为顺序写。官网有数据表明,同样的磁盘,顺序写能到到600M/s,而随机写只有100k/s。这与磁盘的机械机构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间。
-
零拷贝技术
零拷贝并不是不拷贝
传统将文件发送出去需要四次拷贝
1、第一次:将磁盘文件,读取到操作系统内核缓冲区;
2、第二次:将内核缓冲区的数据,copy到application应用程序的buffer;
3、第三步:将application应用程序buffer中的数据,copy到socket网络发送缓冲区(属于操作系统内核的缓冲区);
4、第四次:将socket buffer的数据,copy到网卡,由网卡进行网络传输。
kafka则只用到了第一,第四次拷贝。