在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
确保消息持久化。参考来源: