主要从Kafka特性和使用角度来学Kafka
(1).Kafka吞吐量高的三个原因
1.底层采用零拷贝
2.可以批量来发送接收数据
3.磁盘顺序存储
4.分区存储,分区消费
对于分区消费(此处引入消费者组概念,如果一个topic有k个patition,消费者组有k+1个消费者,那么会有一个消费者是浪费的。)
拓展描述下零拷贝:
常见调用进程读取a.txt文件,发送a.txt字节流到其他机器过程描述:
1.读取磁盘文件,存入到内核态的内存页缓存上。
2.切换到用户态,将页缓存上的数据拷贝到用户态内存上。(一般情况下如果做计算操作,那就在用户编写的代码上体现)
3.用户态切换回内核态,将数据拷贝到socket buffer上
4.将socket buffer上到数据发送到网卡buffer上传输
零拷贝所做到:
1.读取磁盘文件,存入到内核态的内存页缓存上。(same)
2.通过gather机制,底层调用sendfile方法,页缓存+socket fd(存储offset等信息),直接将数据拷到网卡内存。
(2) kafka消费者端保证数据不丢和数据不重复消费
不重复消费可以通过Mysql唯一索引来实现,采用先查再改的方式,由于是多台实例消费,这种情况下事务的原因,会导致插入失败的异常。记得try{}catch{}跳过此次循环。