kafka学习(一)
kafka学习(一)
发布于订阅系统(生产者与消费者模型) 本书基于java语言实现
zookeeper
和kafka
配置安装 (环境:vmware ubuntu 18.04)
发送消息到kafka Broker
创建kafka producer 指明bootstrap servers/keys.deserializer/value.deserializer
send:
- 发送并忘记
- 同步发送,返回
Future
对象,调用get()
方法等待,可能会导致延迟比较大或者堵塞 - 异步发送,指定
callBack
函数,服务器响应时调用
生产者配置
序列化,依托schema,可指定schema注册表 / 反序列化
分区 根据键生成hash值,或者自定义分区策略
从kafka读取数据
消费者群组:包含消费者,一个群组的消费者订阅同一个主题,每个消费者接收主题一部分分区的消息,也可能被闲置
分区再均衡:分区的所有权从一个消费者转移到另一个消费者,比如由于一个消费者崩溃了,则它的工作被该群组中另一个闲置的消费者替代。涉及到向被指派为群组协调器的broker发送心跳来维持其和群组的从属关系以及对分区的所有权关系。
创建kafka consumer 多一个group.id用于确认消费者所属于的群组的名字
订阅主题
subscribe()
方法,可结合正则表达式,匹配多个满足指定条件的主题轮询,消费者通过轮询向服务器请求数据,一旦消费者订阅主题,就由轮询处理群组协调,分区再均衡,发送心跳,获取数据
消费者配置,主要包括心跳间隔,处理偏移,提交偏移的机制,分配策略
- 注:偏移指的是消息在分区里的位置
提交 : 更新分区当前的位置,消费者在由于再均衡后被分配到新的分区,那么它重新开始的位置取决于每个分区最后一次提交的偏移量
可能存在的问题:
上一个消费者正处理的偏移小于它提交的偏移量,那么就会出现重复处理
相反则会出现信息丢失
主要的提交方式:时间间隔提交,必要时期提交,异步提交
再均衡监听器:
调用subscribe()
方法传入ConsumerRebalanceListener
实例,实现接口的两个方法
onPartitionsRevoked(): 再均衡之前和消费者停止处理消息后调用,一般就在这里提交偏移量
onPartitionsAssigned(): 在重新分配分区之后和消费者开始处理消息之前调用
独立消费者:从某个主题的所有分区或者某些特定分区中读取数据,这样就只需要给消费者分配分区就可以了。