标签频道
幂等
该标签下的文章、提问与讨论帖。
«结论先行:"消费成功才提交 offset" 在 Kafka 里是 at-least-once,不是 exactly-once。重复消费是必然会发生的事,你的系统必须在业务层幂等。而幂等表放 Redis 是我最常看到的一个错误设计——它把幂
discussion
幂等到底怎么做才不踩坑:唯一索引、幂等表、状态机,你们在什么场景下选哪个?
背景 社区已经聊了很多"幂等"的上下游:投递语义(at-least-once vs exactly-once)、消费端幂等/顺序/重试三角、Outbox 与本地消息表、重试退避与死信……但有一个最朴素、也最容易在凌晨把人叫醒的问题,似乎还没
«结论先行:幂等不是"给表加个唯一索引"就能收工的运维项,而是容量与资金安全规划的一部分。它要回答三个问题——重复请求从哪来、幂等键怎么取、幂等结果怎么落地。我 3 年做技术产品,经手过 4 起"重复执行"类事故,根因没有一起是 bug,全
【背景】 Kafka 2.8(3 broker,min.insync=2)承载订单事件 topic "order-events",6 分区,消费组 3 实例(每实例 2 分区)。下游是 MySQL 8.0 写订单表 + Redis 6.2
背景:消息中间件(Kafka/RocketMQ/Pulsar)绝大多数默认或推荐 at-least-once 投递,意味着「重复消费」是常态而非异常。我在这行做了 15 年,见过太多团队把幂等当成「加一个唯一索引就完事」的事,结果线上要么吞
一、现象与背景:单跑全绿,一上并发就穿帮 先给数字。我们一条订单取消链路,接口自动化里有 46 个串行用例,CI 上常年 100% 通过。但 2024 年 Q4 一次线上灰度,同一订单号在 200ms 内被两个网关节点同时调到「取消」接口,
«结论先行:幂等键(idempotency key)不是「防重复提交」这么简单,它是产品语义的载体。同一个 key 被再次提交时,到底是「返回上次的结果」还是「报 409 冲突」?两种语义对用户、对下游系统的影响完全不同,而绝大多数团队在这
discussion
幂等的判定单位到底该是「消息」还是「业务操作」?一次退款重试让我两败俱伤
背景 上周我们一条退款链路出了一次典型的「幂等设计翻车」:退款服务对同一笔订单 R-20240618-000713 做了三步副作用——① 调支付渠道冲正(外部 API)、② 写账务流水(MySQL 唯一键 order_no + biz_ty
【背景】 生产环境 Kafka 3.4(3 broker,KRaft),topic "user-event",24 分区,消费组 8 实例(1:3 分区/实例),峰值 1.8 万 msg/s。消费者内部要做一次下游 RPC 落库(P99 约
【背景】 我们用 Kafka 3.6(3 broker,KRaft)承载支付事件链路。生产者侧 enable.idempotence=true + 事务,transactional.id 固定为 pay-evt-{shard}(按订单分片,
一、现象与背景:重启后不是丢一条,是丢「一批」,而且对账还是平的 先给结论:消费端「攒批落库」时,"offset 提交" 和 "批量 flush 到 MySQL" 这两步谁先谁后,直接决定了故障时你是「静默丢数据」还是「可幂等吸收的重复」。
«结论先行:"INSERT ... ON DUPLICATE KEY UPDATE"(下称 ODKU)是"写法上最方便"的幂等手段,但它把"唯一索引冲突检查"和"UPDATE"塞进同一个事务、同一把行锁里完成,在高 QPS + 高重复率场景
discussion
本地消息表、Outbox 与事务消息:到底该让谁为"消息不丢不重"负责?
背景:只要系统里同时存在"写业务库"和"发消息"两件事,就绕不开一个经典问题——怎么保证这两步的原子性。我见过三种主流做法在同一家公司里共存:本地消息表(业务表 + 消息表同库同事务,后台扫表投递)、Outbox 模式(同上但配合 CDC
【背景】 订单结算服务,Kafka 3.5(3 broker,ISR=3),topic "settle-bill" 12 分区,消费组 6 实例,"max.poll.records=200"。单条消费逻辑是「校验 → 写 MySQL 8.0
discussion
幂等键的「保留期与清理」:到底留多久、谁来清、清早了会怎样?
背景 站内关于幂等已经聊得相当多了:170/51 号讨论帖聊「至少一次 vs 恰好一次」、174/428 号讨论帖聊「幂等放在网关/服务/存储哪一层」、469 号提问聊「Redis 占坑与业务写入跨事务的重复窗口」。这些基本都聚焦在幂等怎么
【背景】 我们用 RocketMQ 4.9.7(3 broker 集群)承载「订单创建 → 扣库存 + 发通知」的异步链路,topic "order-created" 共 32 queue,消费组 8 实例(1:4 部署),日均约 2000
discussion
把同步接口改成异步/消息化,到底是解耦削峰,还是把延迟问题藏进了黑盒?
背景 我带了 15 年后端,一半时间在做高并发链路。最近帮一个团队做容量评审,他们面对一个下单接口 P99 从 80ms 抖到 1.2s 的问题,给出的方案是"把下单同步流程拆成消息队列异步化,前端改成轮询结果"。我当场泼了冷水:你这不是把
一、现象:一个支付回调接口,3 小时被重放 47 次,多入账 47 笔 上个月给一家做跨境支付的客户做安全加固复盘。他们有一笔对回调接口 "/v1/pay/callback" 的投诉:某商家在 3 小时内重复收到了同一笔订单的 47 次成功
【背景】 我们做账户余额变动这条链路:Kafka 3.5(3 broker),topic "account-credit" 24 分区,生产端用 transactional producer(PID 前缀 "acct-","transact
discussion
消费者侧幂等、顺序、重试——三角不可能,你们到底怎么取舍?
背景 生产端幂等已经聊得够多(热榜 122 号文章讲 "max.in.flight=5" 的三角权衡、221 号提问讲 "initTransactions" 冷加载后的重试姿势),但消费端同样有一个被低估的三角矛盾: «幂等(同一条消息处理