后端架构

查缓存没命中就全砸到库上,连接池满了怎么办?我用 CompletableFuture 把重复请求合并了一下

请求合并是解决缓存穿透的高效方案:用 ConcurrentHashMap 存 CompletableFuture,首个线程执行查询,后续线程挂起等待同一结果,避免数据库连接池被重复查询打满。需注意用 Optional 包装空值、finally 清理 Map、设置容量上限防内存膨胀,配合本地缓存可消化缓存过期瞬间的并发流量。

后端架构

缓存预热搞不好比冷启动还慢——三种加载策略的耗时曲线和雪崩风险,压测数据摆出来聊聊

缓存预热并非万能解药,策略不当反而会放大风险。全量加载启动慢但运行稳定,需配合TTL打散防雪崩;懒加载启动快但雪崩时毫无自保能力,必须依赖限流熔断;增量加载折中,但热点识别不准则效果大打折扣。选择策略需权衡启动延迟与数据库压力,并针对各自弱点配套保护机制。

后端架构

康威定律之下:我们拆服务前先调了组织,结果跨团队协作还是掉了链子

组织调整是微服务拆分的骨架,但缺乏协作协议会导致跨团队沟通崩溃。问题不在代码所有权,而在团队间的交互接口、排期机制和契约设计未被系统化。需建立跨域需求优先级通道、消费者驱动的接口契约和自动化集成测试,并明确协作节奏与冲突仲裁原则,才能避免信息流动失真。

后端架构

跨服务日志里 traceId 断了,排查时用这几种传参和存储方式把它接上

跨服务调用中 traceId 断层是常见故障根源。文章提出一套完整方案:用带时间戳的雪花算法生成有序 ID,通过 HTTP 头、RPC 隐式传参和 MQ 消息属性统一传递,并在下游做格式校验与兜底生成。日志需用 MDC 输出 traceId、spanId 和服务名,并处理线程池传递。检索时利用时间前缀加速,通过 `trace_source` 字段快速定位断点。

后端架构

缓存命中率跌到多少该告警?我们反过来用空值率和穿透量推了一把阈值

将告警指标从缓存命中率改为空值率和穿透量,可大幅提升异常捕捉速度。空值率直接反映“查无此数据”的请求占比,信号清晰且误报少;配合绝对穿透量阈值作为二级确认,能有效过滤低流量干扰。组合告警规则将发现延迟从分钟级降至秒级,并联动空值缓存策略实现自动止血,同时需注意集群聚合和内存保护等落地细节。

后端架构

订单超时取消时,消息重试用指数退避还是直接扔死信?我们把三种策略放一起跑了一遍

订单超时取消场景下,三种消息处理策略的压测对比显示:业务补偿通过状态校验实现零资损,表现最稳;指数退避在低故障率时延迟友好,但瞬时故障会放大问题;死信队列必须配合监控和人工处理,否则易引发积压和顺序混乱。选择需权衡实时性、开发成本和容错能力。

后端架构

拆微服务时,我们纠结了半年的订单-商品-用户边界,最后被一张数据库表说服了

团队因订单服务拆分半年后决定重新合并,源于对`order_item_snapshot`表的重新审视。争论焦点从按领域还是按用户旅程拆分,转向识别“商品目录”与“商品快照”的本质区别。核心原则是数据跟随其变更原因走,动态商品信息归商品服务,下单时不可变的交易快照归订单服务。最终通过快照表实现订单服务零外部依赖,大幅降低延迟,并明确了“不一致”才是快照的正确行为。

后端架构

拆微服务最怕拆出个“分布式单体”:同步调用链太深、共享数据库、没法独立发布,这三个信号我靠它拦住了好几次

拆分微服务前,需用三个信号体检:同步调用链深度超3层易雪崩,应改异步或合并;共享物理表即耦合,宁可冗余数据;服务不敢独立上线说明交付边界假,需验证发布独立性、契约测试和回滚能力。按序检查可有效拦截分布式单体陷阱。

后端架构

线上缓存雪崩了三次,我们靠自动识别热点 Key 和动态分散才把这事摁住

面对频繁的热点 Key 引发的缓存雪崩,团队构建了一套自动化解决方案。通过客户端采样与 Flink 基线偏离度算法,能在 20 余秒内自动识别热点。识别后,系统会动态计算副本数并分散读请求,同时利用 Keyspace 通知异步同步数据,保证最终一致性。此外,还加入了客户端限流、分片熔断和本地缓存三重兜底,实现了对业务透明的热点防护。