kafka--基础知识点--17--如何保证顺序消费 Kafka本身不保证整个Topic的全局消息顺序但能保证单个分区(Partition)内的消息是有序的。这就像一个快递站所有包裹消息都先送到总站(Topic)但总站内部会分给不同的快递员分区去送每个快递员手里的包裹顺序是固定的但不同快递员之间的顺序就乱了。如何保证消息顺序?把需要保持顺序的消息都发到同一个分区里。按业务Key分区这是最常用的方法。用一个能代表业务主体的唯一标识作为消息的Key比如订单号、用户ID。Kafka会根据这个Key的哈希值把同一主体的所有消息都路由到同一个分区。这样订单的“创建”、“支付”、“发货”消息就能按顺序被处理了。自定义分区器如果业务逻辑更复杂可以自己写一个分区器决定每条消息该去哪个分区。比如把VIP用户和普通用户的消息分开处理。生产者端的配置有两套配置:# 方案一 ackall retriesx max.in.flight.requests.per.connectio1 # 方案二: ackall retriesx enable.idempotencetrue max.in.flight.requests.per.connection1...5 # 可配小于等于5的一个数解析方案一: 只有ackall时正常发送消息没有发送失败的情况时分区中的消息是有序的发送失败时——为了解决消息发送失败配置了retriesx这个参数用于重试发送重试就会导致分区中消息乱序和重复——为了解决重试发送导致的分区中消息乱序配置了max.in.flight.requests.per.connectio1这个参数。引入这个参可以解决重试分区中消息乱序的原因: 这个参数控制生产者在收到服务器响应前可以发送多少个未确认的请求批次如果设置大于1并且网络延迟或服务器响应慢就可能导致消息乱序为了保证严格顺序这个值最好设置为1。但这个方案还有一个问题没有解决分区中的消息可能会有重复消息。所以一般用方案二方案二只有ackall时正常发送消息没有发送失败的情况时分区中的消息是有序的发送失败时——为了解决消息发送失败配置了retriesx这个参数用于重试发送重试就会导致分区中消息乱序和重复——为了解决这两个问题加入了enable.idempotencetrue收到一个 batch 时检查 batch 中第一条消息的 seq if (seq lastSeqNum 1) { 写入 ✅lastSeqNum 更新为 batch 中最后一条的 seq } else if (seq lastSeqNum) { 丢弃 ✅重复消息重试产生的 # 解决重复问题 } else { # 即seq lastSeqNum 拒绝 ❌OutOfOrderSequenceException → seq 超前了说明前面的 batch 还没到 # 解决乱序问题拒绝后等seqlastSeqNum的batch[可能是生产者已经发送过但由于网络抖动失败后再次发送的]到了以后当前seq lastSeqNum的batch被拒绝后生产者没有收到确认响应也会再次发送这个batch以此保证顺序正常 }但是幂等不允许太多 batch 在途否则导致乱序拒绝概率大增因此限制max.in.flight.requests.per.connection最大为5方案一生成者无幂等配置时是没有消息序号的因此只能配置1物理串行发送保证消息有序。消费者端的处理消息到了消费者端如果处理不当顺序也可能被破坏单线程消费最简单有效的方法是用单线程同步消费一个分区的消息这样就能保证顺序多线程和异步都不能保证顺序消费。多线程消费如果要用多线程提高消费速度必须确保同一个分区的消息由同一个线程处理不同分区的消息可以并行处理。特别提醒扩容问题如果一个Topic的分区数需要从N扩容到M(MN)那么新加入的分区会导致原有的Key哈希计算结果变化部分消息会被分配到新的分区这可能会导致这些消息的顺序性被破坏。全局顺序vs局部顺序绝大多数业务场景只需要“局部顺序”即同一业务主体内的消息有序不同主体之间可以并行处理。追求全局顺序虽然能保证但会牺牲Kafka的高并发性能通常不推荐。

相关新闻

最新新闻

iOS26 完整体验:液态玻璃背后,iOS26系统得与失

iOS26 完整体验:液态玻璃背后,iOS26系统得与失

介绍:前言:要我说,这次的 iOS 26 绝对是一次大规模视觉与功能大改,也是苹果多年以来第一次对UI大改,“大改”方面主要引入了 液态玻璃 Liquid Glass全新设计语言,同时也对底层调度、生态互联、安全机制各个…

2026/8/21 21:23:35
FactorSmith框架:基于MDP分解与多智能体迭代的复杂模拟构建指南

FactorSmith框架:基于MDP分解与多智能体迭代的复杂模拟构建指南

1. 从“智能体”到“模拟世界”:FactorSmith 要解决的核心痛点最近在折腾大语言模型(LLM)驱动的智能体(Agent)时,我遇到了一个非常典型的问题:我想让一个智能体去模拟一个复杂的商业决策过程&am…

2026/8/21 21:23:35
Hash Join内存不足的诊断与调优——批量分析场景的执行计划、临时文件与参数实验实战

Hash Join内存不足的诊断与调优——批量分析场景的执行计划、临时文件与参数实验实战

文章目录每日一句正能量1. 背景与问题:Hash Join慢,到底是Join算法不行,还是哈希表被迫写盘?2. 环境与数据:先构造一个能稳定复现“多批Hash”的批量分析场景2.1 第一份基线必须同时保存计划和监控数据2.2 执行计划重点…

2026/8/21 21:23:35
QHotkey 全局快捷键的 8 个坑:注册失败、按键失灵、程序挂起,原因与规避方案

QHotkey 全局快捷键的 8 个坑:注册失败、按键失灵、程序挂起,原因与规避方案

QHotkey 全局快捷键的 8 个坑:注册失败、按键失灵、程序挂起,原因与规避方案 【免费下载链接】QHotkey A global shortcut/hotkey for Desktop Qt-Applications 项目地址: https://gitcode.com/gh_mirrors/qh/QHotkey 你注册了 CtrlAltQ&#xff…

2026/8/21 21:23:35
三步在 ESXi 上安装 macOS:ESXi Unlocker 实战部署教程

三步在 ESXi 上安装 macOS:ESXi Unlocker 实战部署教程

三步在 ESXi 上安装 macOS:ESXi Unlocker 实战部署教程 【免费下载链接】esxi-unlocker VMware ESXi macOS 项目地址: https://gitcode.com/gh_mirrors/es/esxi-unlocker 本教程用 ESXi Unlocker 在 VMware ESXi 6.5/6.7/7.0 上安装 macOS:前置四…

2026/8/21 21:23:35
2元CH32V003实现PWM风扇控制器:极致复用的嵌入式设计实践

2元CH32V003实现PWM风扇控制器:极致复用的嵌入式设计实践

上周在整理旧项目时,翻出一个用STM32F103做的风扇控制器,看着上面密密麻麻的飞线和外挂的驱动芯片,突然意识到一个问题:我们是不是习惯了用“大炮打蚊子”?一个简单的PWM调速,真的需要动用几十个引脚、上百…

2026/8/21 21:18:35