06、Kafka实战:生产者消息分区

一.为什么分区

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

*

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

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

二.kafka的分区策略

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

轮询策略

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

*

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

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

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

随机策略

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

*

按消息键保顺策略

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

*

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

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

三.案例:

如何实现消息的顺序性

解决方案一:不建议使用

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

优化后的方案

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

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

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: