为什么要使用Kafka?
1.解耦合
2.削峰
kafka基本架构与message结构
kafka由producer,broker,consumer组成
message由key和value组成
如果key不为空会根据hashcode值,分配到不同的分区里面
如果
key == null
,则从sendPartitionPerTopicCache(sendPartitionPerTopicCache
的类型是HashMap.empty[String, Int])
中获取分区ID,如果找到了就直接用这个分区ID;否则随机去选择一个partitionId,并将partitionId存放到sendPartitionPerTopicCache
中去。而且sendPartitionPerTopicCache
是每隔topic.metadata.refresh.interval.ms时间才会清空的
kafka为什么不使用高阶API去自动维护offset
首先高阶是按照固定时间间隔去提交offset,假如有一批数据来了,消费者还没来得及消费数据,这个时候时间间隔到了,把offset的值提交了上去,此时消费者挂了,那么下次再启动消费者的时候,因为我们offset的值依然是之前的,这个时候会造成数据丢失。
假如这批数据来的时候,处理的非常快,此时还没来的及提交offset的值,当消费者宕机之后,再一次启动消费者会造成数据重复消费
kafka分区分配原则
1.range范围分配,roudrobin轮询分配
kafka如何实现高吞吐
kafka的分区,一个分区在同一时间内只能被同一个消费者组里面的一个消费者消费
kafka的分区数和消费者数量相等的时候,实现最高的吞吐
kafka如何保证数据可靠性
producer有三种模式0,-1,1
0代表消费发给broker分区中的leader之后就不管了,可靠性低
1代表发送数据给leader,等数据落盘之后,leader给producer一个ack应答,producer确认数据落盘之后继续执行
-1代表不仅数据发送给leader罗盘后,还要要求follow从leader上拉取数据落盘后,才会给produce一个应答
broker到consumer可以采用低阶消费来保证数据不丢失