Shopify 用 MySQL 替换 Redis 做库存预留——而且规模化运行了
Shopify 关于用 MySQL 替换 Redis 来做库存预留的工程文章,引发了围绕单一事务型数据存储与双系统设计(用 Redis 做快速计数器)之间权衡的讨论。评论者剖析了提议的 MySQL 方案——每个可预留单位一行、使用 SKIP LOCKED 以及有限缓冲区——质疑其复杂性、在类似闪购负载下的可扩展性,以及更简单的基于购物车或 Redis 的方案是否就足够。另一条讨论线批评公司大量使用 AI 生成的技术内容,并对 Shopify 的领导文化和政治立场提出担忧,一些读者表示这削弱了他们对公司工程产出的信任。
对 Shopify 领导层与文化的看法
- 几位评论者聚焦于领导层的政治立场,指称其支持极右翼议题,以及在投票和移民问题上的争议观点。
- 一些人描述了负面的工作经历:对辱骂性词汇和粗鄙行为的容忍、雇用“酷”的非技术人员,以及一种大力推动使用 AI 的文化。
- 也有人要求更多具体证据,链接到批评性媒体报道,或认为政治角度与这篇技术帖子无关。
AI 撰写的博客文章与“slop”担忧
- 许多人认为这篇工程博客文章大体上是 LLM 生成的,理由是其文风:大量使用破折号、列表化结构、口号式表达,以及诸如简短对比句之类的“LLM 味”写法。
- 有人觉得它可读且信息量足;也有人认为这种风格冗长、信息密度低,比人写的技术文章更难解析。
- 更广泛的不满在于,公司发布的是 AI 美化过的内容,而不是工程师自己的声音;AI 语气正在渗入人类写作。
MySQL 对比 Redis,以及向 SQL 集中
- 有些人认同用 Redis 替换:维护两个存储系统会增加复杂性,尤其当库存事实本来就存在于 SQL 中时。
- 另一些人认为 Redis 非常适合预留系统,在高并发下扩展性很好,而且可以作为库存的主系统而无需与 SQL 同步。
- 关于 Redis 的持久性和事务也有争论:一方强调它的持久化和事务特性;另一方指出在严格 fsync 下性能会下降,而且缺少 SQL 工具链。
逐单位行与 SKIP LOCKED 以及缓冲池
- 这种设计——针对每个商品/地点设置有上限的“每单位一行”缓冲,使用
SELECT … FOR UPDATE SKIP LOCKED,再配合补货任务——被一些人视为把锁竞争巧妙地分散到多行上。 - 也有人觉得 1000 行缓冲和补货机制“笨重”或是“算法味道不佳”,担心其复杂性和边界情况。
替代设计与 UX 权衡
- 提议的替代方案包括:每个购物车–SKU 一行、在结账而不是付款时预留、对放弃的购物车做后台 GC,或者使用工作流引擎/持久对象来做按商品协调。
- 批评者认为,许多替代方案仍然把竞争集中到单个聚合行上,或者需要额外系统。
- 对于何时预留库存也存在分歧:早一点(在购物车/结账时)以获得更好的 UX,还是晚一点(在付款时)以避免放弃购物车囤货和错失销售。
更广泛的架构主题
- 持续存在的争论包括:微服务 vs 单数据库的简洁性、SQL vs NoSQL,以及大型公司是否应该构建自定义数据引擎,而不是依赖 MySQL。