一. KafKa介绍
- Kafka是一种分布式的,基于发布订阅的消息系统,实现业务与数据层解耦,减少冗余和丢失风险,扩展性高,灵活和高峰处理能力强,可恢复性高,具有顺序性,加入了缓冲层提高了执行效率,实现了异步处理机制。
二. Kafka的架构
- Broker:Kafka集群包含一个或多个服务器,这种服务器被称为broker
- Topic:每条消息有一个类别,这个类别被称为Topic,在逻辑上可以被认为是一个队列queue
- Partition:每个Topic包含一个或多个Partition,是物理上的概念
- Producer:负责发布消息到Kafka的broker中
- Consumer:向Kafka broker读取消息的客户端
- Consumer Group:每个consumer属于一个特定的Consumer Group,每个Group可以看成是一个订阅者
- Kafka删除旧数据的方法:基于时间,基于partition文件大小
- 可以配置每个partition需要备份的个数,每个partition将会被备份到多台机器上,以提高可用性
- 每个partition都有一个server为leader负责所有的读写操作,如果leader失效,将会有其它follower来接管,作为leader的server承载了全部的请求压力,因此有多个partitions就意味着有多个leader,kafka会将leader均衡分散在每个实例上,确保整体的性能稳定
- Kafka通过递增offset来消费数据,broker是无状态的,不需要标记哪些消息被消费过,不需要保证一个Group只有一个consumer消费,因此不需要锁机制,这是Kafka高吞吐率的原因之一
- 对于一个topic,同一个group中不能有多于partitions个数的consumer同时消费,否则将意味着某些consumer将无法得到消息
- 如果Topic中replicationfactor为N,那么允许N-1个kafka实例失效,即只要有一个replicas实例存活,可以保证消息正常的发送和接收
三.Producer消息路由
- Producer发送消息到broker时,会根据Partition机制选择存储到哪个Partition,从而实现负载均衡。在创建Topic时可以通过参数进行设置。
- 发送消息时,可以设置消息的key,例如key为整数,则key与Partition总数取余,则该消息会被发送到该数对应的partition中
四 消息传送机制
- Kafka中有3中不同的消息传送机制
- at most once: 最多一次,发送一次,无论成败,将不会重发
- at least once: 消息至少发送一次,如果没能接收成功,可能会重发,直到接收成功
- exactly once:消息只会发送一次,kafka中没有严格的实现,即没有必要
五 Consumer Group
- Consumer high level API,同一个Topic的一条消息只能被同一个Consumer Group内的一个consumer消费,但多个Consumer Group可同时消费这个消息
- Kafka实现广播的方法:每个consumer有一个独立的Group即可
- Kafka实现单播的方法:所有的consumer在同一Group里
六 分配
- 当broker启动后,会向Zookeeper注册自己的节点信息,当broker和zookeeper断开连接时,znode会被删除
- 每个consumer客户端被创建时,也会像zookeeper注册自己的信息,从而实现负载均衡
- consumer设置中,会设置每次fetch的消息大小,当消费一定量的消息之后,将会向zookeeper自动提交offset信息,每消费一条,先本地保存,然后定期提交,可以设置定期提交的时间间隔
- 在producer配置时,request.required.acks=0/1/2,其中0表示producer不会等待broker发送ack,1表示当leader接收到消息之后发送ack,22表示当所有follower都同步消息成功后发送ack
- producer可以设置同步或者异步,异步则消息会在本地buffer中,进行适时的批量发送,默认为sync同步,建议使用async