观察者模式适合电商库存扣减通知场景:库存服务作为被观察者,在扣减成功或超卖时广播事件,订单、物流等下游系统作为观察者异步响应;超卖检测需内置扣减逻辑,通过乐观锁或Redis原子操作实现,并发布对应事件。

观察者模式非常适合电商库存扣减后的通知场景:当库存发生变化(尤其是扣减成功或超卖发生时),多个下游系统(如订单状态更新、物流触发、风控告警、消息推送等)需要被及时、解耦地通知,而无需修改库存核心逻辑。
核心思路:库存服务作为被观察者,通知者作为观察者
将库存扣减操作封装为一个可被观察的“主题”(Subject)。每次执行扣减前/后,由库存服务主动通知所有注册的观察者。关键不是“谁来监听”,而是“谁在变化时有责任广播”。超卖检测应放在扣减逻辑内部(例如数据库乐观锁或 Redis 原子操作失败时),一旦判定超卖,立即触发特定事件(如 InventoryOverSoldEvent),再由观察者响应。
典型实现步骤(以 Java + Spring 为例)
1. 定义事件与观察者接口
创建统一事件基类(如 InventoryEvent),派生具体事件(InventoryDeductedEvent、InventoryOverSoldEvent)。观察者实现 InventoryObserver 接口,声明 onEvent(InventoryEvent event) 方法。
2. 库存服务持有观察者列表并提供注册/通知能力
库存服务(如 InventoryService)维护 List<InventoryObserver>,提供 register() 和 notifyObservers(event) 方法。注意线程安全(可用 CopyOnWriteArrayList)。
3. 扣减逻辑中嵌入事件发布
在 deduct(String skuId, int quantity) 方法内:
- 先执行原子扣减(如 SQL:
UPDATE inventory SET stock = stock - ? WHERE sku_id = ? AND stock >= ?) - 检查影响行数:为 0 → 超卖 → 创建
InventoryOverSoldEvent并调用notifyObservers() - 影响行数 > 0 → 扣减成功 → 发布
InventoryDeductedEvent
更现代的做法:用 Spring Event 或消息队列解耦
硬编码观察者列表虽清晰但扩展性受限。生产环境推荐:
-
Spring ApplicationEvent:库存服务发布
ApplicationEvent,各模块通过@EventListener监听,天然支持异步(@Async)、事务绑定(@TransactionalEventListener) - 消息中间件(如 RocketMQ/Kafka):库存服务扣减后发送事件消息到 topic,下游服务各自订阅。彻底解耦,支持失败重试、延迟通知、流量削峰
注意:超卖事件必须保证至少一次投递,避免因网络或消费失败导致告警遗漏。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
关键细节与避坑点
事件内容要完整:包含 skuId、requestedQty、currentStock、timestamp、orderId(如有),方便观察者做精准处理或审计。
避免在观察者中阻塞主流程:库存扣减本身需高性能低延迟。所有通知逻辑(如发短信、写日志、调风控接口)必须异步执行,否则拖慢下单链路。
超卖不等于错误,而是业务事实:观察者收到 OverSoldEvent 后,应做补偿动作(如自动取消订单、通知人工介入、触发补货流程),而非抛异常中断库存服务。
不复杂但容易忽略

















