Skip to content

Commit abc9918

Browse files
committed
feat:《大营销平台系统》第16节:引入MQ处理活动SKU库存一致性
1 parent ca26380 commit abc9918

File tree

7 files changed

+49
-1
lines changed

7 files changed

+49
-1
lines changed

docs/.vuepress/config.js

+1
Original file line numberDiff line numberDiff line change
@@ -2154,6 +2154,7 @@ function getBarBigMarket() {
21542154
"api/第13节:引入分库分表路由组件.md",
21552155
"api/第14节:抽奖活动订单流程设计.md",
21562156
"api/第15节:抽奖活动流水入库.md",
2157+
"api/第16节:引入MQ处理活动SKU库存一致性.md",
21572158
"none.md",
21582159
]
21592160
},
Loading
Loading
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
---
2+
title: 第16节:引入MQ处理活动SKU库存一致性
3+
pay: https://t.zsxq.com/188e3DFyj
4+
---
5+
6+
# 《大营销平台系统设计实现》 - 营销服务 第16节:引入MQ处理活动SKU库存一致性
7+
8+
作者:小傅哥
9+
<br/>博客:[https://bugstack.cn](https://bugstack.cn)
10+
11+
>沉淀、分享、成长,让自己和他人都能有所收获!😄
12+
13+
- **本章难度**:★★★☆☆
14+
- **本章重点**:引入 RabbitMQ 消息组件,在活动SKU库存消耗完毕后,触发消息推送更新库存为最终一致。
15+
- **课程视频**[https://t.zsxq.com/18gaoKYEn](https://t.zsxq.com/18gaoKYEn)
16+
17+
**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。
18+
19+
## 一、本章诉求
20+
21+
完成活动责任链判断,包括;活动的校验【日期、状态、sku库存】,之后是sku 库存的扣减操作。 之后这里会涉及一个缓存库存和数据库库存一致性问题,是本节要处理的重点。一个手段是之前在策略实现阶段采用的延迟队列做趋势更新,另外一个是本节要引入 RabbitMQ 在库存消耗空以后发送 MQ 消息,直接更新清空最终库存,保持缓存与数据库的一致性。
22+
23+
**注意**,可能此时缓存消耗库存阶段有失败丢失,不完全等于数据库真实库存。不过没关系,先保证一个统一库存即可。后续可以扫描统计订单数量,来校准库存。
24+
25+
## 二、功能流程
26+
27+
完善责任链功能,和库存数据一致性的处理;
28+
29+
<div align="center">
30+
<img src="https://bugstack.cn/images/article/project/big-market/big-market-23-01.png" width="850px">
31+
</div>
32+
33+
- 第一步;完成责任链的活动校验,时间、状态、库存。
34+
- 第二步;对库存的扣减,使用 decr + lock 锁的方式(兜底)进行处理。
35+
- 第三步;做完库存扣减后,发送延迟队列,由任务调度更新趋势库存,满足最终一致。
36+
- 第四步;库存消耗为0后,发送MQ消息,驱动变更数据库库存为0

docs/md/project/big-market/notes.md

+10-1
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,13 @@ DDD 中的依赖倒置是一个非常好的设计,尤其是与 MVC 结构对
140140

141141
- 第1个手段;每次消费incr值,写入延迟队列,趋势更新数据库数据。最终一致。
142142
- 第2个手段;incr 库存值消耗为0时,发送mq消息,更新最终库存量。(可能不准,比如incr值消耗中,少卖的情况)
143-
- 第3个手段;活动到期后,任务扫描活动产生订单量,校准库存。
143+
- 第3个手段;活动到期后,任务扫描活动产生订单量,校准库存。
144+
145+
### 【其他】3. 什么情况下使用DDD架构,什么情况下使用mvc架构?
146+
147+
DDD 是软件设计方法,对复杂的项目更为合适。但这里要清楚,DDD 如果只的是设计方法中的建模工程结构,和 MVC 对比的话。DDD 的结构更为先进,即使不使用 DDD 的软件设计方法,只遵循这套结构,都是可以编写出非常好的代码的。MVC 的约束相对较低,个人开发还好,如果多人协作,会出现腐化严重的问题。
148+
149+
### 【其他】4. 设计模式带来了什么好处?举个例子
150+
151+
设计模式可以让工程设计的迭代性、扩展性、维护性,都更强,更好。如,抽奖策略计算中,用到了责任链、组合模式的规则树。规则树可以动态的调整配置的节点,来满足各种业务诉求。还可以结合产品需求,迭代的时候添加对应的节点开发就可以。避免了大量if...else的使用,让变动范围缩小到指定的类中。研发成本更低,提测质量更高(测试更快),交付效率更强。这些都是使用设计模式的优势。
152+

docs/md/road-map/canal.md

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ lock: need
1010

1111
> 沉淀、分享、成长,让自己和他人都能有所收获!😄
1212
13+
<iframe id="B-Video" src="//player.bilibili.com/player.html?aid=1902486427&bvid=BV1Gm411r7kz&cid=1484158643&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true" width="100%" height="480"> </iframe>
14+
1315
本文的宗旨在于通过简单干净实践的方式教会读者,配置出一套 Canal 工具服务,来同步分库分表的数据到 Elasticsearch 文件夹系统中。同时在 SpringBoot 工程中,配置出两套数据源,一套是 MySQL + MyBatis,一套是 Elasticsearch + MyBatis。【这是非常重要的设计手段】
1416

1517
虽然现在有 TiDB 这样的分布式数据库,但对于分库分表 + 数据同步ES,依然是非常主流的方案。同时也有一部分是把分库分表的数据同步到 TiDB 使用。

0 commit comments

Comments
 (0)