初试kafka
角色
生产者消费者broker:即kafka服务实例
主题 和 分区
kafka中消息以主题为单位进行归类,生产者将消息发送到特定主题主题还可以细分为多个分区,一个分区只属于一个主题,且同一主题下的不同分区消费到的消息是不同的每个分区还有多副本机制,分区中的所有副本(AR)= ISR(同步副本) + OSR(滞后副本)
HW 和 LEO
HW:意指 HIGH WATERMARK,代表消息偏移量,消费者只能消费到这个偏移量以前的消息LEO:标识着当前日志文件中下一条待写入消息的offset,ISR中每个副本都会维护LEO
分区的HW = 当前分区(ISR)中的min{LEO}
生产者
消息的发送方式
发后即忘同步: producer.send(record).get,性能较差异步: producer.send(record,new callBack())
生产者组件
序列器:一般使用默认的分区器:如果消息ProducerRecord中指定了partition字段,就不需要分区器,否则根据key字段计算拦截器: onSend() 发送前调用 , onAcknowledgement:ack之前或发送失败调用 , close:关闭拦截器之前
消费者
消费组
消费者隶属于某个消费组,当消息发布到主题后,只会被投递到订阅他的某个消费组中的某个消费者 Kafka既支持P2P 也支持(Pub/Sub)模式,正是因为有消费组的抽象层
订阅主题
subscribe()某个主题,具有自均衡功能 ,推荐使用后subsribe的主题 会覆盖先 subsribe的主题正则表达式,可以匹配多个主题assign() 方法不仅可以订阅,还可以指定订阅的主题下的某个分区,不具有自均衡功能
消息消费
kafka消费是pull模式,消费端需要不断的调用poll方法
一般采用poll方法,有timeout参数,限制poll阻塞的时间consumer.records(TopicPartition)会消费指定分区的内容
位移提交
消费位移:当前消费者 从broker拉取的消息的位置
存储位移:消息在broker底层的存储偏移
自动提交 :虽然简单,也可能存在重复消费 和消息遗失,默认开启自动提交(enable.auto.commit)
手动提交 : 存在同步commitSync() 和 异步commitAsync(), 也都存在重复消费的问题