在CentOS上使用Kafka保证消息顺序,需从分区策略、生产者配置、消费者配置三方面入手,核心依赖分区内有序性,具体方法如下:
固定分区键(Key)
为消息指定唯一键(如订单ID、用户ID),相同键的消息会被分配到同一分区,确保分区内的消息按发送顺序存储。
// 示例:使用订单ID作为Key
ProducerRecord<String, String> record = new ProducerRecord<>("order-topic", "order-123", "支付成功");
启用幂等性与单次重试
enable.idempotence=true:避免重试时消息重复或乱序。max.in.flight.requests.per.connection=1:限制未确认请求仅1个,防止重试导致顺序错乱。单分区单消费者
while (true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, String> record : records) {
process(record); // 串行处理
consumer.commitSync(); // 同步提交偏移量
}
}
避免重平衡影响
session.timeout.ms和heartbeat.interval.ms,减少消费者掉线导致的重平衡。replication.factor设置副本数(≥2),配合acks=all确保消息持久化。参考来源: