如何系列 如何确保 Kafka 消息的顺序性

文章目录

为了确保 Kafka 消息的顺序性,我们需要考虑几个重要方面。以下是详细的说明:

单分区内消息有序性

Kafka 保证同一分区内的消息是有序的。生产者发送到同一分区的消息会按发送的顺序存储,消费者从同一分区读取消息时也会按存储的顺序读取。因此,只要所有相关消息都发送到同一分区,就能保证消息的顺序性。

分区键(Partition Key)

在发送消息时,可以指定一个分区键。Kafka 使用分区键来确定消息应该发送到哪个分区。通过对相关消息使用相同的分区键,确保这些消息会发送到同一个分区,从而保证它们的顺序性。

生产者配置

Kafka 1.x 版本之前

在 Kafka 1.x 版本之前,保证单分区内消息有序的条件如下:

  • max.in.flight.requests.per.connection=1:这意味着在接收服务器确认之前,生产者只能发送一个未确认的请求,从而确保消息顺序。
Kafka 1.x 及以后版本

在 Kafka 1.x 及以后版本,保证单分区内消息有序的条件如下:

  • 开启幂等性(enable.idempotence=true)
    • max.in.flight.requests.per.connection ≤ 5:Kafka 服务端会缓存生产者发来的最近 5 个请求的元数据,从而确保这些请求的数据有序。
  • 未开启幂等性
    • max.in.flight.requests.per.connection=1:与 Kafka 1.x 之前的版本类似,这也确保消息顺序。

此外,设置 acks 为 "all" 可以确保所有副本都确认接收到消息,从而提供更强的一致性保证。

消费者配置

消费者从同一分区读取消息是按顺序读取的。使用自动提交(enable.auto.commit)或手动提交偏移量,确保消息处理的顺序性和一致性。

幂等消息

在 Kafka 中,生产者默认不是幂等性的,但可以通过配置使其成为幂等性生产者。这在 Kafka 0.11.0.0 版本中引入,设置幂等性的方法如下:

复制代码
javaCopy codeProperties props = new Properties();
props.put("enable.idempotence", "true");

启用幂等性后,生产者自动升级为幂等性生产者,Kafka 自动处理消息的重复去重。

局部幂等

幂等性仅在单分区和单会话中有效。也就是说,它只能保证单个主题的单个分区上不出现重复消息,并且仅在生产者进程的一次运行期间有效。

全局幂等

为了实现全局幂等性,需要结合业务逻辑和外部存储(如数据库)来确保跨会话和跨分区的消息幂等性。这需要在应用层进行额外的处理,如消息去重逻辑。

示例代码

以下是一个配置示例,展示了如何在生产者中设置这些参数以确保消息顺序性:

java 复制代码
javaCopy codeProperties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("acks", "all");
props.put("enable.idempotence", "true");
props.put("max.in.flight.requests.per.connection", "5");

KafkaProducer<String, String> producer = new KafkaProducer<>(props);

String topic = "your_topic";
String key = "your_partition_key";
String value = "your_message";

ProducerRecord<String, String> record = new ProducerRecord<>(topic, key, value);
producer.send(record);

producer.close();

通过以上配置和代码,Kafka 可以确保消息在同一分区内的顺序性。

相关推荐
运维行者_4 小时前
企业带宽监控工具实战:网络流量分析与异常排查的5个关键能力
运维·服务器·开发语言·网络·分布式·后端·php
jeffwang6 小时前
我把同一个压测做错了三次,第四次才发现真正的瓶颈
分布式·性能优化·rust
ai_coder_ai6 小时前
事件驱动架构(EDA)在分布式业务系统中的应用
分布式·架构
蓝胖的四次元口袋8 小时前
分布式知识梳理(4)
分布式
书香门第8 小时前
系统设计练习 - 分布式黑名单服务(design a distributed denylist service)
分布式·系统架构·系统设计
江畔柳前堤16 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
霸道流氓气质20 小时前
RabbitMQ 延迟队列与死信队列:原理、实现与实战
分布式·rabbitmq·ruby
爱吃面的猫21 小时前
大数据Kafka3.x之——Kafka3.3.0安装与使用(详细)
大数据·分布式·zookeeper
小张同学a.1 天前
zabbix企业级监控平台4——分布式监控与grafana数据可视化
linux·运维·数据库·分布式·信息可视化·zabbix·grafana
番茄炒鸡蛋加糖1 天前
分布式 CAP、BASE 理论 & 中间件 CAP 取舍
分布式·中间件