kafka学习(一)

发布于订阅系统(生产者与消费者模型) 本书基于java语言实现

  • zookeeperkafka 配置安装 (环境:vmware ubuntu 18.04)

发送消息到kafka Broker

  1. 创建kafka producer 指明bootstrap servers/keys.deserializer/value.deserializer

  2. send:

    1. 发送并忘记
    2. 同步发送,返回Future对象,调用get()方法等待,可能会导致延迟比较大或者堵塞
    3. 异步发送,指定callBack函数,服务器响应时调用
  3. 生产者配置

  4. 序列化,依托schema,可指定schema注册表 / 反序列化

  5. 分区 根据键生成hash值,或者自定义分区策略

从kafka读取数据

消费者群组:包含消费者,一个群组的消费者订阅同一个主题,每个消费者接收主题一部分分区的消息,也可能被闲置

分区再均衡:分区的所有权从一个消费者转移到另一个消费者,比如由于一个消费者崩溃了,则它的工作被该群组中另一个闲置的消费者替代。涉及到向被指派为群组协调器的broker发送心跳来维持其和群组的从属关系以及对分区的所有权关系。

  1. 创建kafka consumer 多一个group.id用于确认消费者所属于的群组的名字

  2. 订阅主题 subscribe() 方法,可结合正则表达式,匹配多个满足指定条件的主题

  3. 轮询,消费者通过轮询向服务器请求数据,一旦消费者订阅主题,就由轮询处理群组协调,分区再均衡,发送心跳,获取数据

  4. 消费者配置,主要包括心跳间隔,处理偏移,提交偏移的机制,分配策略

    • 注:偏移指的是消息在分区里的位置

提交 : 更新分区当前的位置,消费者在由于再均衡后被分配到新的分区,那么它重新开始的位置取决于每个分区最后一次提交的偏移量

可能存在的问题:

  • 上一个消费者正处理的偏移小于它提交的偏移量,那么就会出现重复处理

  • 相反则会出现信息丢失

主要的提交方式:时间间隔提交,必要时期提交,异步提交

再均衡监听器:

调用subscribe()方法传入ConsumerRebalanceListener实例,实现接口的两个方法

  • onPartitionsRevoked(): 再均衡之前和消费者停止处理消息后调用,一般就在这里提交偏移量

  • onPartitionsAssigned(): 在重新分配分区之后和消费者开始处理消息之前调用

独立消费者:从某个主题的所有分区或者某些特定分区中读取数据,这样就只需要给消费者分配分区就可以了。