目录 1、kafka是什么一种高吞吐量的分布式、发布订阅消息系统,它可以处理消费者规模的,网站中的所有动作流数据,具有高性能、持久化、多副本备份、横向扩展能力……
image.png
2、消息从生产到消费2.1、发送数据永远找leader!消息写入leader后,follower是主动的去leader进行同步的!producer采用push模式将数据发布到broker,每条消息追加到分区中,顺序写入磁盘,所以保证同一分区内的数据是有序的!
image.png
发送数据可靠性保证:ACK机制! 0:代表producer往集群发送数据不需要等到集群的返回,不确保消息发送成功。安全性最低但是效率最高。 敲黑板:所以这里可能是会丢消息的哟! 0:发丢了,生产端不知道,就是丢了。 2.2、保存数据你以为是这样的: image.png
其实是这样的: image.png
操作系统本身有一层缓存,叫做 Page Cache,是在内存里的缓存,我们也可以称之为 OS Cache,意思就是操作系统自己管理的缓存。你在写入磁盘文件的时候,可以直接写入这个 OS Cache 里,也就是仅仅写入内存中,接下来由操作系统自己决定什么时候把 OS Cache 里的数据真的刷入磁盘文件中。 Kafka提供了一个参数——producer.type来控制是不是主动flush,如果Kafka写入到mmap之后就立即flush然后再返回Producer叫 同步 (sync);写入mmap之后立即返回Producer不调用flush叫异步 (async)。 敲黑板:所以这里也可能是会丢消息的哟! 假如已经写在了OS cache中但是还没来得及刷入磁盘,此时突然机器宕机,或者broker重启,那就丢了。 2.3、消费数据消费者通过pull模式主动的去kafka集群拉取消息,与producer相同的是,消费者在拉取消息的时候也是找leader去拉取。 多个消费者可以组成一个消费者组(consumer group),每个消费者组都有一个组id!同一个消费组者的消费者可以消费同一topic下不同分区的数据,但是不会组内多个消费者消费同一分区的数据。 image.png
在早期的版本中,消费者将消费到的offset维护zookeeper中,consumer每间隔一段时间上报一次,这里容易导致重复消费,且性能不好!在新的版本中消费者消费到的offset已经直接维护在kafka集群的__consumer_offsets这个topic中! 消费消息的时候可以大致分为两个阶段:1、标示该消息已被消费(commit记录一下);2、处理消息。 敲黑板:所以这里也可能是会丢消息的哟! 先commit,但是在处理消息的异常了,此时这条消息就丢了。 3、消息可靠性保证
从 Producer 向 broker 发送消息时,通过ACK机制保证不丢消息,但是不可靠,依赖kafka的参数配置:
在broker存储消息时,通过主动flush来保证可靠性,但是如果没设置强制flush,那就有可能丢了。 从 broker 到 Consumer 消费消息时,数据处理与 commit 的顺序在很大程度上决定了消息从 broker 和 consumer 的可靠性:
|
|
来自: liang1234_ > 《kafka》