消息重复消费和幂等处理
这篇按踩坑笔记来写,因为 消息重复消费和幂等处理 我现在更容易记住“错在哪”,而不是“定义长什么样”。 先记住这句话消费者必须假设消息可能重复到达。 很多问题不是不会用,而是用得太顺手了,顺手到把边界条件给省掉了。 这类问题一般怎么出现我脑子里会先放这个场景:用订单号和消息类型做消费记录表。 一开始看着都像是个小问题,真正麻烦的是它往往不是立刻报错,而是跑一阵子、数据一多、并发一上来才暴露。 这次我想盯住的坑 用业务唯一键去重 数...
MQ 为什么能削峰,但不能解决所有问题
这篇按踩坑笔记来写,因为 MQ 为什么能削峰,但不能解决所有问题 我现在更容易记住“错在哪”,而不是“定义长什么样”。 先记住这句话消息队列把同步压力转成异步处理,但增加最终一致性复杂度。 很多问题不是不会用,而是用得太顺手了,顺手到把边界条件给省掉了。 这类问题一般怎么出现我脑子里会先放这个场景:把下单后的积分发放改成异步消息。 一开始看着都像是个小问题,真正麻烦的是它往往不是立刻报错,而是跑一阵子、数据一多、并发一上来才暴露。...
分布式锁应该注意哪些边界
今天把 分布式锁应该注意哪些边界 补成一篇正常一点的学习笔记,不写大而全,就记我这轮最想吃透的部分。 一句话先立住锁只解决互斥,不自动保证业务正确。 我这次真正记住的点 锁要有过期时间 释放锁要校验持有者 业务执行超时要考虑续期或失败 为什么我会专门记这块因为它很容易出现一种错觉:看资料的时候觉得自己会了,真到写接口、改 SQL、配事务、看线程池参数时又开始发虚。 我现在尽量把知识点挂到一个具体场景上:用 Redis 锁保护优惠...
Redis 过期时间设置的几个细节
今天不想写长文,先把 Redis 过期时间设置的几个细节 这块拆成几条短一点的问答。面试里经常会被连续追问,如果只背一句定义,第二问基本就卡住了。 先说我自己的结论过期时间既影响命中率,也影响系统压力曲线。 我现在会先把这类题分成“定义是什么、为什么这样设计、代码里怎么用、容易翻车在哪”四层去答。这样比死背一段话稳很多。 快问快答 热点 key 过期要错开。我现在的理解:先记结论,再回到代码里找一个能验证它的场景。 永久 key ...
缓存一致性不能只靠删除缓存
这篇我想按“排查记录”来写,主题是 缓存一致性不能只靠删除缓存。这种写法比纯概念文更适合我自己回看。 现象先别急着解释缓存一致性要结合读写路径、失败重试和容忍时间。 先把现象钉住,比急着下结论有用。很多时候真正的关键不是“答案是什么”,而是“我是怎么一步步排到这里的”。 我会先看哪几件事 先更新数据库再删缓存是常见选择 删除失败要补偿 强一致场景不要轻易加缓存 带入一个排查场景设计商品价格更新后的缓存删除和消息补偿。 如果这是线...
缓存穿透、击穿、雪崩重新整理
这篇按踩坑笔记来写,因为 缓存穿透、击穿、雪崩重新整理 我现在更容易记住“错在哪”,而不是“定义长什么样”。 先记住这句话三个问题都表现为压力打到数据库,但成因不同。 很多问题不是不会用,而是用得太顺手了,顺手到把边界条件给省掉了。 这类问题一般怎么出现我脑子里会先放这个场景:给商品详情缓存加空值缓存、互斥重建和随机过期。 一开始看着都像是个小问题,真正麻烦的是它往往不是立刻报错,而是跑一阵子、数据一多、并发一上来才暴露。 这次我...
Redis 常用数据结构和适用场景
今天不想写长文,先把 Redis 常用数据结构和适用场景 这块拆成几条短一点的问答。面试里经常会被连续追问,如果只背一句定义,第二问基本就卡住了。 先说我自己的结论先按访问模式选结构,再谈命令。 我现在会先把这类题分成“定义是什么、为什么这样设计、代码里怎么用、容易翻车在哪”四层去答。这样比死背一段话稳很多。 快问快答 String 适合简单缓存和计数。我现在的理解:先记结论,再回到代码里找一个能验证它的场景。 Hash 适合对象...
数据库字段设计的一些小原则
今天把 数据库字段设计的一些小原则 补成一篇正常一点的学习笔记,不写大而全,就记我这轮最想吃透的部分。 一句话先立住字段设计要让约束、含义和演进成本清晰。 我这次真正记住的点 字段名表达业务含义 状态字段要有枚举约束 金额和时间类型要统一 保留审计字段 为什么我会专门记这块因为它很容易出现一种错觉:看资料的时候觉得自己会了,真到写接口、改 SQL、配事务、看线程池参数时又开始发虚。 我现在尽量把知识点挂到一个具体场景上:设计一张...