Kafka小结(一)

定义

kafka是一个消息的发布-订阅系统

组成

producer:消息生产者,用于消息的生产
consumer:消息消费者,用于消费消息队列中的消息
broker:kafka集群包含的服务器,内部存储了topic等信息
topic:消息话题,可看做消息的分类
partition:kafka的消息存储的单位,把topic划分成多个分区,物理上存储消息
replica:partition中的一个概念,消息副本。一个partition可以创建多个消息副本
leader:replica的细化,producer和consumer只和leader交互
follower:replica的细化,用于备份leader的数据
controller:kafka集群的一个服务器,管理broker的上下线,分区的分配策略和leader的选举
zookeeper:kafka通过zk存储meta信息

kafka的pull模式

kafka采用的是消费者拉取消息的pull模式。

为什么不采用push模式?

首先清楚push模式的一大缺陷在于,如果producer的生产消息速度远大于consumer消费消息的速度,那么作为消息队列,压力将会非常严重。 因此kafka采用的是消费者决定消费的pull模式

pull模式的问题

pull模式首先需要consumer与客户端建立一个长链接,不停的询问客户端是否有消息产生,造成了很大的性能消耗。
缓解方案:建立长链接是添加了一个timeout时间,隔一段时间再询问客户端。

Producer

分区策略

首先,生产者发送消息数据时,需要先把数据封装成一个ProduceRecord对象。

  • 若制定了分区,则直接分配至该分区
  • 没有指明分区,但是指明了key的情况下,用key的hash值与该topic的partition数进行取余,得到的就是分区编号
  • 若既没有指定partition,也没有key,在第一次进行此类分区时,生成一个随机整数,与topic的partition数取余,得到partition。第二次则直接使用该整数取余。

ISR

ack

ack是kafka内producer生产消息的数据可靠性保证。
partition在接收到producer生产的消息后,需要向producer发送ack来表示自己收到了消息。

何时发送ack?

kafka采取的策略是当所有follower同步完leader的消息后发送ack?

问题:若此时有一个follower由于网络阻塞/宕机,无法完成同步,怎么办?

引入ISR(In Sync Replica)的概念,将follower添加进ISR中,给定一个时间,若超出时间仍未同步完成,则踢出ISR队列。

ack的三种模式

0:意味着producer不等待broker同步完成的确认,继续发送下一条(批)信息。

leader已经死亡,producer不知情,还会继续发送消息broker接收不到数据就会数据丢失

1:意味着producer要等待leader成功收到数据并得到确认,才发送下一条message。此选项提供了较好的持久性较低的延迟性。

Partition的Leader死亡,follwer尚未复制,数据就会丢失

-1:意味着producer得到follwer确认,才发送下一条数据

持久性最好,延时性最差。

可能造成数据重复。

Consumer

offset存储

为了保证消费的顺序性,kafka会存储一个offset以记录消费位置,若消费者发生重启的情况,将以offset为开始进行消费,从而避免重复消费。
offset在kafka0.9版本以前存储在zookeeper节点上,后续版本更新后,kafka内部启动了一个topic,consumer_topic用于记录offset

分区策略

  1. RoundRobin
    RoundRobin把Topic作为一个整体,按comsumer group进行划分。对topic的partition进行重排序后,consumer以轮询的方式进行消费。
    这种方式的调用前提:当前消费者组内的订阅topic是一致的

问题:会造成同组内未订阅Topic的consumer进行消费该topic
例如:同一组的两个消费者A,B;A订阅了topic1,topic2,B订阅了topic3;但是RoundRobin判断topic1、topic2、topic3由消费者组订阅,则再进行重排序后轮询,造成B未订阅topic1、topic2也会对其消费的情况。

2.Range
按当前topic进行划分,首先关注的是消费者,再关注消费者组

问题:会造成消费者消费信息不对等。
例如:一个消费者组内成员为A、B,另一个组内为C,对于topic1、topic1;A订阅了topic1,B订阅了topic1、topic2;C订阅了topic1;

分区时机

当消费者数量变化时:例如启动消费者时,或者添加或者减少消费者个数。
当消费者组里的消费者个数发生变化,都要重新分配分区。

offset的commit问题

消费者消费partition后,记录offset的位置,需要commit后才会写入磁盘。
若不commit,消费者重启后只会从上一次commit的offset的位置开始消费,造成重复消费。

  1. 如果先消费数据再commit;

如果消费者消费了数据后,在commit前死亡,重启消费者后会造成数据重复消费的问题

  1. 如果先commit,在消费数据;

如果消费者commit后,死亡;重启后继续消费,则会造成数据漏消费的问题。


在这里插入图片描述

kafka的知识点很多,上面写的这些还远远不够,前行的路总是艰辛的,加油吧,骚年!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值