一.为什么分区

  • kafka主题(Topic):是承载真是数据的逻辑容器
  • 主题之下由若干分区,kafka的消息组织方式是三级结构:主题-分区-消息;    
  • 主题下的每条消息只会保存在某一个分区中,不会再多个分区中被保存多份。

kafka为甚使用分区的概念而不是直接使用多个主题

  • 分区的作用是提供负载均衡的能力,实现数据的高伸缩性(Scalability)
  • 不同分区能够被放置在不太节点的机器上,而数据读写操作也是针对分区这个粒度进行的。
  • 每个节点的机器都能独立的执行各个分区的读写请求。并且可以通过增加新的节点机器增加整体系统的吞吐量。

二.kafka的分区策略

决定生产者将消息发送到哪个分区的算法。

轮询策略

  • Round-robin策略,即顺序分配。

 轮询策略是kafka Java生产者API默认提供的分区策略,如果未指定其他策略,将均匀码放。

缺点:不能保证消息顺序性。

  • 轮询策略有非常优秀的负载均衡表现,他总能保证消息最大限度的被平均分配到所有分区上,故默认情况下他是最合理的分区策略,也是我们最常见的分区策略之一。

随机策略

   Randomness策略,随机策略是我们随意的将消息放置在任意一个分区上。

按消息键保顺策略

  • kafka允许每条消息定义消息键,简称key
  • key可以是有明确业务含义的字符串,比如客户代码,部门编号,业务ID等
  • 一旦消息被定义了key,那么可以保证同一key的所有消息都进入到相同的分区里;
  • 由于每个 分区下的消息处理都是有顺序的,这个策略被称为按消息键保顺策略

kafka默认分区策略实际上同时实现了两种策略:

  • 指定了key,默认实现按消息键保序策略;
  • 没有指定key,使用轮询策略;    

三.案例:

   如何实现消息的顺序性

 解决方案一:不建议使用

  • kafka主题设置分区:1个分区。
  • 所有的消息都在一个分区里读写,因此保证了全局的顺序性。
  • 这样虽然实现了因果关系的顺序性,但是丧失了kafka多分区带来的高吞吐和负载均衡的优势。

优化后的方案

  •  根据业务在消息体中封装固定的标志位,为标志位设定专门的分区策略,保证同一标志位的所有消息都发送到同一分区。
  • 保证分区的消息顺序,同时支持高吞吐和负载均衡。

也可以自定义实现分区策略。

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐