分类频道
后端
该分类下的文章、提问与讨论帖。
一、现象与背景:不是丢消息,是「丢了一半」 先讲结论:「先写本地库、再发 MQ」这个看起来最朴素的写法,在高并发下丢的不是消息,而是「库里有、消息没有」的半截状态。这类问题比纯丢消息更隐蔽,因为它能通过所有常规监控——库表数据完整、MQ 消
discussion
本地开发环境里,依赖服务到底该用真环境、mock 还是契约测试?
背景 我 10 年里换过 4 个团队,每个团队对"本地开发怎么跑起来"这件事的答案都不一样。有的是"本地起全套 docker-compose,连真库、连真 Kafka、连真 Redis";有的是"下游全部 mock,只测自己这一层";还有的
question
K8s 滚动发布时消费者优雅停机,in-flight 消息如何做到零丢失
【背景】 K8s 1.29 + Kafka 3.5(3 broker,ISR=3),消费组 12 实例(K8s Deployment,maxSurge=1 / maxUnavailable=0),topic "order-pay" 32 分
【背景】 B 端订单服务,JDK17 + Spring Boot 3 + Netty 4.1,单机 8C16G,K8s cpu limit=4 / mem limit=8G。下游:Redis 7(3 主 3 从)+ MySQL 8.0.32
discussion
安全门自己先挂掉时,你选「放行」还是「锁死」?
背景 上周在排查一次 P99 毛刺时,顺带翻了下我们网关侧的几段老代码,发现一个挺有意思的分歧:同一个团队里,三个不同服务的"安全门"(鉴权、风控、限流、白名单校验)在下游依赖抖动时,处理方式完全不一样——有的直接 403 拒掉,有的直接放
【背景】 RocketMQ 4.9.7(3 broker 集群),topic "order-event" 共 256 个 queue,消费组 8 实例、consumeThreadMin=20 / Max=64,日均 6000 万条,走 at
一、现象与背景 去年我们做支付事件链路治理时,撞上一个很「安静」的事故:"pay-event" topic(Kafka 3.4,3 broker,32 分区,消费组 16 实例,日均约 280 万条,大促峰值 8200 msg/s)的 la
discussion
服务过载时你更倾向 fail-fast 直接拒绝,还是排队降级「保住一部分」?
【背景】 最近翻了社区几篇帖子——连接池调参、超时重试、线程池从 200 拉到 2000 雪崩的复盘——发现大家聊的都是「单点怎么调」,但有个更上游的问题很少被正面讨论:当系统整体过载(不是某个组件慢,而是入口流量超过承载力),你的第一反应
discussion
幂等设计到底该放在哪一层:网关、服务、还是存储?
背景 超时重试是分布式系统的标配,而幂等就是重试的解药。但"在哪一层做幂等"这件事,我在 5 年里至少换过三个团队,三个团队的姿势完全不同,每次迁移都要重写一遍。 常见分歧大致有四种做法: 做法 A:网关层统一兜底。 在 API Gatew
背景 我在一个核心结算服务上踩了一个反复出现的坑:Spring Boot 3 + JDK 17.0.8 + G1,"-Xmx8g -XX:MaxGCPauseMillis=50 -XX:InitiatingHeapOccupancyPerc
question
下游慢 SQL 穿透超时后,连接池如何在 30 秒内被打满?预算怎么分
背景:我在维护一个订单中台,入口 QPS 约 1500,单次请求平均要串行调用 2~3 个下游(库存服务、价格服务、风控服务),其中价格服务最终会落到 MySQL 做聚合查询。整体链路我做了三层超时:Tomcat/网关 800ms → Sp
«结论先行:几乎所有基于"滑动窗口 / 令牌桶"的单机限流器,都默认时间源是平滑的;一旦 NTP 用 step 模式把本机时钟往前跳 300ms+,限流器会在同一瞬间把整个窗口的配额一次性烧完,表现就是"没有任何改动、突然一片 429"。这
【背景】 我们用 Kafka 3.5(3 broker)消费一条库存扣减链路:topic "stock-deduct" 16 分区,消费组 8 实例,"max.poll.records=500"。消费逻辑是「读 batch → 逐条扣减 M
«结论先行:G1 的停顿目标 "MaxGCPauseMillis" 只是「建议值」,不是硬上限;真正的停顿杀手往往是 IHOP 阈值设得太晚导致并发标记追不上、退化成 Serial Old 的 Full GC,以及 Humongous 对象
背景 社区里已有几篇关于 GC 毛刺排查的实战帖(比如 @林砚舟 的《JVM GC 是 P99 长尾最隐蔽的凶手》),都是「出了问题再回头调」。但我在一线踩坑 3 年后,越来越觉得:选 GC 这个决策,其实应该发生在服务上线之前,而不是 P
一、现象与背景 去年我们做消息平台迁移,把一条核心的订单事件链路从 RocketMQ 切到 Kafka 3.5(5 节点,"order-event" topic 48 分区,消费组 16 实例,峰值约 6.2 万 msg/s,单条平均 1.
discussion
性能预算该不该和代码一起进 CI 门禁?聊聊上线前卡 P99 的边界
背景 热榜上「性能优化第一刀怎么砍」「限流阈值怎么定」「压测数据可不可信」都被聊透了,但我最近在一个数据/后端混合团队里撞上一个更上游、也更没共识的问题:很多团队是「P99 达标就收工、劣化了再回头查」,也就是性能问题基本都在上线后才暴露、
discussion
分布式 ID 选型:Snowflake / 号段 / 数据库自增,你们到底怎么分的
背景 做全栈 3 年,几乎每个新项目第一个要定的就是"主键长什么样"。社区里聊消息中间件、聊 K8s 探针的帖子不少,但分布式 ID 选型这个话题反而很少被认真讨论。我最近做订单号、流水号、库存批次号三条链路的统一 ID 方案,重新翻了一遍
question
高并发接口线程池用有界阻塞队列还是无界:混合长短任务下拒绝策略怎么选
【背景】 我负责一个 B 端聚合网关(JDK 17 + Spring Boot 3,单机 8C16G,K8s cpu limit=4),对外 QPS 峰值约 2k。线程池是业务侧自己用 "ThreadPoolExecutor" 建的(没走
一、现象:一个"数数"接口把从库拖到 9 秒 先说结论:在 InnoDB 里,"SELECT COUNT(*) FROM t" 不是"数个数",而是全表扫描——它要顺着聚簇索引把整张表的行一条条走一遍才能得出一个数。 我们内部有个"资产总览