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

发布时间:2021-11-22 09:56:12 作者:iii
来源:亿速云 阅读:135

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

kafka分区说明

kafka分区结构

kafka分区策略

官方分区策略

轮询策略

随机策略

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

按消息键保序策略

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

基于地理位置的分区策略

List<PartitionInfo> 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<String> 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分区、生产和消费这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. Kafka使用总结与生产消费Demo实现
  2. kafka生产数据不能均匀到每个分区

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

kafka

上一篇:JSP中文乱码怎么办

下一篇:c语言怎么实现含递归清场版扫雷游戏

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》