400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

怎么理解kafka分区、生产和消费

这篇文章主要讲解了“怎么理解kafka分区、生产和消费”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解kafka分区、生产和消费”吧!

周村网站建设公司成都创新互联公司,周村网站设计制作,有大型网站制作公司丰富经验。已为周村上千多家提供企业网站建设服务。企业网站搭建\外贸网站制作要多少钱,请找那个售后服务好的周村做网站的公司定做!

kafka分区说明

kafka分区结构

kafka分区策略

官方分区策略

轮询策略

随机策略

List partitions = cluster.partitionsForTopic(topic);
return ThreadLocalRandom.current().nextInt(partitions.size());

按消息键保序策略

List partitions = cluster.partitionsForTopic(topic);
return Math.abs(key.hashCode()) % partitions.size();

基于地理位置的分区策略

List partitions = cluster.partitionsForTopic(topic);
return partitions.stream().filter(p -> isChina(p.leader().host())).map(PartitionInfo::partition).findAny().get();

自定义分区策略

kafka分区存储策略

kafka压缩

生产者压缩

消费者解压缩

kafka分区消息保序

存储消息保序

消费消息保序

消息路由策略

生产者

消息生产过程

  1. Producer先通过分区策略确定数据录入的partition,再从Zookeeper中找到Partition的Leader

  2. Producer将消息发送给分区的Leader。

  3. Leader将消息接入本地的Log,并通知ISR(In-sync Replicas,副本同步列表)的Followers。

  4. ISR中的Followers从Leader中pull消息,写入本地Log后向Leader发送ACK(消息发送确认机制)。

  5. Leader收到所有ISR中的Followers的ACK后,增加HW(high watermark,最后commit 的offset)并向Producer发送ACK,表示消息写入成功。

生产者保证发送成功

  1. 必须使用producer.send(msg, callback)接口发送消息。

  2. Producer端设置acks参数值为all。acks参数值为all表示ISR中所有Broker副本都接收到消息,消息才算已提交。

  3. 设置Producer端retries参数值为一个较大值,表示Producer自动重试次数。当出现网络瞬时抖动时,消息发送可能会失败,此时Producer能够自动重试消息发送,避免消息丢失。

  4. 设置Broker端unclean.leader.election.enable = false,unclean.leader.election.enable参数用于控制有资格竞选分区Leader的Broker。如果一个Broker落后原Leader太多,那么成为新Leader必然会造成消息丢失。因此,要将unclean.leader.election.enable参数设置成false。

  5. 设置Broker端参数replication.factor >= 3,将消息保存多份副本。

  6. 设置Broker参数min.insync.replicas > 1,保证ISR中Broker副本的最少个数,在acks=-1时才生效。设置成大于1可以提升消息持久性,生产环境中不能使用默认值 1。

  7. 必须确保replication.factor > min.insync.replicas,如果两者相等,那么只要有一个副本挂机,整个分区无法正常工作。推荐设置成replication.factor = min.insync.replicas + 1。

  8. 确保消息消费完成再提交。设置Consumer端参数enable.auto.commit为false,并采用手动提交位移的方式。

生产者拦截器

Properties props = new Properties();
List interceptors = new ArrayList<>();
interceptors.add("com.yourcompany.kafkaproject.interceptors.AddTimestampInterceptor"); // 拦截器1
interceptors.add("com.yourcompany.kafkaproject.interceptors.UpdateCounterInterceptor"); // 拦截器2
props.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, interceptors);

消费者

消费过程

  1. Consumer向Broker提交连接请求,连接的Broker会向其发送Broker Controller的通信URL,即配置文件中的listeners地址;

  2. 当Consumer指定了要消费的Topic后,会向Broker Controller发送消费请求;

  3. Broker Controller会为Consumer分配一个或几个Partition Leader,并将Partition的当前offset发送给Consumer;

  4. Consumer会按照Broker Controller分配的Partition对其中的消息进行消费;

  5. 当Consumer消费完消息后,Consumer会向Broker发送一个消息已经被消费反馈,即消息的offset;

  6. 在Broker接收到Consumer的offset后,会更新相应的__consumer_offset中;

消费者拦截器

重复消费问题的解决方案

感谢各位的阅读,以上就是“怎么理解kafka分区、生产和消费”的内容了,经过本文的学习后,相信大家对怎么理解kafka分区、生产和消费这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


文章名称:怎么理解kafka分区、生产和消费
文章来源:http://mzwzsj.com/article/igoodo.html

其他资讯

让你的专属顾问为你服务