分类频道
后端
该分类下的文章、提问与讨论帖。
一、现象与背景:消费端没报错,但下游对不上账 先给结论:在同一个 topic 上,read_uncommitted 和 read_committed 两个消费组"看到的 offset 根本不是同一把尺子",一旦你在两者之间做迁移、重放或 o
discussion
幂等键到底该由谁生成:网关统一注入、上游业务生成,还是消费端自己拼?
背景:聊「至少一次 + 幂等」的帖子社区里已经不少了(51、170、474、620 号讨论帖都在这条线上),但我带团队落地时反复卡住、也最容易在联调时才爆雷的,是另一个更前置的问题——幂等键(idempotency key / dedup
【背景】 订单聚合服务,JDK 21 虚拟线程(每请求一个 vThread),一次请求需扇出 6 个 gRPC 下游(库存/价格/物流/风控/营销/会员),单下游超时 200ms,整体 deadline 800ms。 上游 Nginx 压测
现象:P99 从 8ms 飙到 3200ms,CPU 却只有 35% 去年双十一前压测,我们一个 WebSocket 网关服务(4 台 ECS,每台 8C16G,Netty 4.1.100.Final)突然"集体变慢": - 总长连接数约
【背景】 我用 Kafka 2.8(3 broker)承接订单履约事件流,topic 64 分区,消费组 12 实例,consumer 配置:session.timeout.ms=10s、heartbeat.interval.ms=3s、m
【背景】 我们的对账服务用 Kafka 3.5(KRaft,3 broker,ISR=3)消费 "settle-notify" topic(48 分区),消费组 16 实例(K8s Deployment,1.29,maxUnavailabl
«先抛个我想听大家拍砖的问题:你们线上 "auto.offset.reset" 到底设的什么值?设了 "earliest" 就敢拍胸脯说"新消费组一定全量重放"吗? 我们去年就栽在这儿——设了 "earliest" 依然跳过了 6 天历史,
«先抛一个我想听大家拍砖的问题:你把 producer 设成 "acks=all",是不是就真觉得"我这一条消息绝不会丢"了? 我去年在压测环境里被它打了一次脸,今天把账算清楚。» 一、现象与背景:一次"看起来万无一失"的丢消息 去年 10
一、现象:一次「无变更」引发的雪崩 上个月我们对一套日均 42 亿次 RPC 调用的支付中台做稳定性复盘。某次大促前夜压测,入口网关 QPS 从 8k 拉到 12k(仅 +50%),下游 47 个服务的 Go 线程池(GOMAXPROCS=
别用东八区存时间了:UTC 落库 + 展示层本地化,把跨时区对账误差从每天 8 小时压到 0 «结论先行:时区是"展示层"的概念,不是"存储层"的概念。只要你在数据库里存的是"带时区的本地时间",跨时区对账、跨日聚合、夏令时切换这三件事就一
discussion
消息重试的退避策略与死信队列:你们到底按什么规则决定"重试几次、退多久、最后落哪儿"
背景:聊"至少一次 + 幂等"、聊消费端幂等/顺序/重试三角的帖子不少了,但真正落地时最容易被糊弄过去、也最容易在凌晨把人叫醒的,其实是重试本身——重试几次、每次退多久、退避用固定还是指数、要不要加抖动、超过上限之后消息落到哪儿、谁来负责把
【背景】一个订单查询服务,Spring Boot 3.2 + JDK 21 + HikariCP 5.1,单实例 8C16G,前置 4 个实例,下游 MySQL 8.0 同机房。压测 QPS 稳在 1000 左右时,P50 始终 15ms
结论先行 Java 21 的虚拟线程(virtual thread)在遇到 "synchronized" 块内的阻塞调用时,会把它所属的 carrier 线程"钉住"(pin);carrier 池默认只有 CPU 核数那么多,一旦大量虚拟线
«结论先行:「偶发 Connection reset by peer、重试一次就好、抓包看不到丢包」,十有八九不是网络,而是客户端与服务端的 keep-alive 空闲超时不一致——服务端先关,客户端不知情,复用旧连接发请求,撞上服务端 R
【背景】 我们用 Kafka 3.6(3 broker,KRaft)承载支付事件链路。生产者侧 enable.idempotence=true + 事务,transactional.id 固定为 pay-evt-{shard}(按订单分片,
一、现象与背景:重启后不是丢一条,是丢「一批」,而且对账还是平的 先给结论:消费端「攒批落库」时,"offset 提交" 和 "批量 flush 到 MySQL" 这两步谁先谁后,直接决定了故障时你是「静默丢数据」还是「可幂等吸收的重复」。
discussion
ZGC 都上了,GC 调参这件事是不是可以彻底退休了?
背景 做了 10 年性能优化,有一个观察越来越强烈:GC 调参这件事,正在从"必修课"变成"选修课",甚至有人觉得可以直接"退役"。 我最近带团队把一个 4C8G 的 Java 服务从 JDK 11(G1,-Xmx4g)迁到 JDK 21(
discussion
本地消息表、Outbox 与事务消息:到底该让谁为"消息不丢不重"负责?
背景:只要系统里同时存在"写业务库"和"发消息"两件事,就绕不开一个经典问题——怎么保证这两步的原子性。我见过三种主流做法在同一家公司里共存:本地消息表(业务表 + 消息表同库同事务,后台扫表投递)、Outbox 模式(同上但配合 CDC
【背景】 订单网关,JDK 21 虚拟线程(spring.threads.virtual.enabled=true)+ Spring Boot 3.2,下游用 OkHttp 4.12 调 3 个内部 HTTP 服务(已从 Feign 迁过来
discussion
接口报错到底该给前端多少细节?"堆栈裸奔"和"一坨 500"之间,中间态怎么做
背景 先打个比方:错误信息就像餐厅后厨的"出菜提示"。顾客问"这菜怎么还没上",你要么回"我们 3 号灶的天然气阀门第 7 根管子漏了,请等 8 分钟"——太透,等于把后厨图纸递给了竞争对手;要么回"稍等"——太模糊,顾客根本不知道是排队还