kafka生产者消费者的一些原理

kafka:

消息队列:用于暂存数据,这就具有了解耦和削峰的作用,以应对临时高峰期达到缓冲的目的
 1.Kafka是一种高吞吐量的分布式发布/订阅式消息系统
  2.它可以处理消费者规模的网站中的所有动作流数据
  3.具有高性能、持久化、多副本备份、横向扩展能力
生产者:
 消息写入leader后,follower是主动的去leader进行同步的!
 producer采用push模式将数据发布到broker,每条消息追加到分区中,顺序写入磁盘,所以保证同一分区内的数据是有序的!
分区的主要目的:
  1、 方便扩展。提高负载能力,,,因为一个topic可以有多个partition,所以我们可以通过扩展机器去轻松的应对日益增长的数据量。
  2、 提高并发。以partition为读写单位,可以多个消费者同时消费数据,提高了消息的处理效率。
分区的原则,数据发往哪个partition呢?kafka中有几个原则:
  1、 partition在写入的时候可以指定需要写入的partition,如果有指定,则写入对应的partition。
  2、 如果没有指定partition,但是设置了数据的key,则会根据key的值hash出一个partition。
  3、 如果既没指定partition,又没有设置key,则会轮询选出一个partition。

ACK应答机制
  在生产者向队列写入数据的时候可以设置参数来确定是否确认kafka接收到数据,这个参数可设置的值为0、1、all。
  0代表producer往集群发送数据不需要等到集群的返回,不确保消息发送成功。安全性最低但是效率最高。
  1代表producer往集群发送数据只要leader应答就可以发送下一条,只确保leader发送成功。
  all代表producer往集群发送数据需要所有的follower都完成从leader的同步才会发送下一条,确保leader发送成功和所有的副本都完成备份。安全性最高,但是效率最低。

如果往不存在的topic写数据,能不能写入成功呢?kafka会自动创建topic,分区和副本的数量根据默认配置都是1。

存储
  生产者生产的消息不断追加到log文件末尾,防止文件过大,查找效率变慢,kafka采用分片和索引机制
  分片:对log文件分片,1G为一片
  索引:即.index文件,存储索引和对应log文件中每条消息的起始位置
查找
根据二分查找找到对应的.index文件,从而找到对应消息的初始位置
消费者
多个消费者可以组成一个消费者组(consumer group),每个消费者组都有一个组id!
同一个消费组者的消费者可以消费同一topic下不同分区的数据,但是不会组内多个消费者消费同一分区的数据!!!

消费者组内的消费者小于partition数量:会出现某个消费者消费多个partition数据的情况,消费的速度也就不及只处理一个partition的消费者的处理速度!
如果是消费者组的消费者多于partition的数量:多出来的消费者不消费任何partition的数据。
所以在实际的应用中,建议消费者组的consumer的数量与partition的数量一致!

你可能感兴趣的:(Kafka,kafka)