Kafka在处理数据的重要思想
- 数据在处理的时候采取分而治之。a)数据没有关联性(无序),可以随机打散到任意的分区。 b)数据有关联的(有序)放在同一个分区。 (推荐这样处理)
- 数据是有关联的时候消费尽量避免多个分区对应多个消费者的情况发生,这样很难保证有序性 partition:consumer= 1:1 = n:1 这样天然有序 一般我们采用分区和消费者一对一的方式落地
- group思想,不同group内的可以消费相同数据,相同group不能消费同一条数据
- 单个consumer可以多线程处理(一般可采用单线程,比较简单),但是要注意offset的同步问题,避免重复消费和数据丢失问题
- 大数据时代一个核心思想,分治是一个必然的趋势和结果,无序数据可以任意处理,有序的数据必须要线性处理。
Kafka的在实战中的工作流程
- zk在kafka集群中的作用:在老版本中zk在kafka集群中起到调度和存储的作用,随着请求和数据的爆发,zk就只负责协调调度不在负责存储(因为存储的话网络IO会成为整个集群的瓶颈)。(中间过渡时代有的公司会使用一些DB进行存储如redis,mysql)
- topic:topic是一个逻辑分区,其实物理上是不存在的,不同的topic数据是分离的,并且现在每个topic自己维护offset信息。topic是可以跨broker,也是可以跨partition的。 topic-> mem metadata->磁盘,持久化
- producer:生产者会把数据打散到各个partition中,但是打散数据是按照一定的规则去进行的,相同类型的数据不会分到不同的partition中一般情况下,我们利用这种规则去保证数据的有序性。
- consumer:对于consumer的思考就是如何安全有序快速的消费数据,一般情况下我们可以串行消费数据或者并发消费数据,和拉取的粒度问题(按条天然有序,按批次)。说到并发就会想到多线程。但是在多线程中保证数据不会丢失或者重复消费就是重中之重。那么这两个问题就是下面我们要聊的offset
- offset:这个就是保证数据可靠性的关键。如果按批次拉取数据的话,有一个概念很重要就是我们处理数据的时候要么全部失败,要么全部成功,这样的就不会出现丢失或者重复消费的情况,当然我们也可以丢低预防重复消费,在持久化的时候进行一下幂等。
- group组的出现更加的方便我们解耦,不同的group之间数据是完全隔离的,两个group之间可以消费同一条内容,但是同一个group不行。可以利用group的概念去把数据给到不同的业务进行相关的业务操作。
下面是一些kafka处理相关的示意图:
分享一个模型
这里给大家分享是一个模型叫左AKF模型,大家可以去了解一下。学会用akf模型分析问题。
作用
所有场景基本都是围绕这个三个特性来的,异步,削峰填谷,解耦。
进一步剖析kafka工作原理
- ACK:是kafka的producer的消息发送确认机制,这直接影响了kafka的吞吐量和可靠性。ack一般有三个值1,0,-1,一般来说默认是1,producer只要收到一个分区副本成功写入的通知就认为推送消息成功了。这个副本必须是leader副本。只有leader副本成功写入了,producer才会认为消息发送成功;ack=0,producer发送一次就不会在发送了,不管是否发送成功;ack=-1,简单来说就是,producer只有收到分区内所有副本(ISR状态)的成功写入的通知才认为推送消息成功了。
- ISR:(in-sync replicas),连通性&活跃性,"心跳"
- OSR:OSR(outof-sync replicas),超过阈值时间(10秒),没有"心跳"
- AR(Assigned replicas):面向分区的副本集合,创建topic的时候你给出了分区的副本数,那么controller在创建的时候就已经分配了broker和分区的对应关系,并得到了该分区的broker集合 AR=ISR+OSR
需要知道的几个概念
- LW:Low Watermark
- HW:High Watermark
- LEO:LogEndOffset
- kafka也可以做存储(弹性类似redis的lru,会裁剪历史数据)