TwKit

推文

@Zen_with_AI · 2026-10-12 06:05

小路带你60天学系统设计Day 15/60|消息队列:解耦、削峰与异步 Day 14 讲到删缓存失败时,可以把"删缓存"发进消息队列重试。今天讲消息队列本身——它是分布式系统里出场率最高的组件之一。 为什么需要它?三个词:解耦、削峰、异步。解耦:下单服务只管往队列里丢"订单创建"事件,短信、库存、风控各自订阅,谁挂了都不影响下单主流程。削峰:秒杀时 10 万 QPS 瞬间涌入,队列把它削成 DB 扛得住的形状慢慢消费。异步:主流程不必等发短信、推通知做完才返回,响应时间直接下来。 核心概念很简单:生产者往 topic 里写消息,消费者从 topic 读;topic 拆成多个 partition 并行;offset 记录每个消费者读到了哪里。记住一句话:消息队列的本质,是把同步调用变成可持久、可重放的异步事件流。 Kafka 的顺序性是个常考点:顺序保证只在单个 partition 内成立。同一 key 的消息会被路由到同一 partition,所以"同一个用户的订单事件有序"能做到;跨 partition 之间则没有任何顺序。想要全局有序,只能用单 partition,代价是吞吐掉下来。 投递语义分三档:at-most-once 最多一次(可能丢,适合日志打点);at-least-once 至少一次(可能重复,工程上的默认选择,配上幂等消费者);exactly-once 精确一次(Kafka 靠幂等生产者加事务实现,代价最高)。重复消费不可怕,可怕的是重复带来副作用,所以 at-least-once 一定要配幂等。 还有死信队列 DLQ:一条消息反复消费失败(比如格式坏了),一直重试会卡住整个 partition。把它扔进 DLQ 隔离,人工介入处理,主流程继续走。 选型一句话:要吞吐选 Kafka,要灵活路由选 RabbitMQ,要存算分离和多租户选 Pulsar。 💡 思考题:at-least-once 语义下,消费者侧做幂等有哪几种常用手段?各自的代价是什么? Day 16 预告:分布式事务 #系统设计60天

曝光 613 · 评论 1 · 点赞 5 · 书签 0 · 曝光/时 141.17973929500832

TwKit
正在载入