1- ![ ] ( https://ws2.sinaimg.cn/large/006tKfTcly1fr1z9k79lrj31kw11zwt8 .jpg )
1+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d713e19ed .jpg )
22
33## 前言
44
3737
3838先看看实际项目的结构:
3939
40- ![ ] ( https://ws2.sinaimg.cn/large/006tKfTcly1fr38jkau5kj30jk07a754 .jpg )
40+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d71693bb0 .jpg )
4141
4242还是和以前一样:
4343
@@ -173,24 +173,24 @@ public class OrderServiceImpl implements OrderService {
173173手动调用下 ` createWrongOrder/1 ` 接口发现:
174174
175175库存表:
176- ![ ] ( https://ws3.sinaimg.cn/large/006tKfTcly1fr38x4wqhcj30g404ajrg .jpg )
176+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d7189c72f .jpg )
177177
178178订单表:
179- ![ ] ( https://ws1.sinaimg.cn/large/006tKfTcly1fr38xpcdn7j30f0040glq .jpg )
179+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d721e9fd4 .jpg )
180180
181181一切看起来都没有问题,数据也正常。
182182
183183但是当用 ` JMeter ` 并发测试时:
184184
185- ![ ] ( https://ws2.sinaimg.cn/large/006tKfTcly1fr391hontsj31ge0b8dgt .jpg )
185+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d7243c657 .jpg )
186186
187187测试配置是:300个线程并发,测试两轮来看看数据库中的结果:
188188
189- ![ ] ( https://ws4.sinaimg.cn/large/006tKfTcly1fr393xxc0rj31ge0463z6 .jpg )
189+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d726cee79 .jpg )
190190
191- ![ ] ( https://ws4.sinaimg.cn/large/006tKfTcly1fr3939yo1bj30c4062t8s .jpg )
191+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d72816d67 .jpg )
192192
193- ![ ] ( https://ws4.sinaimg.cn/large/006tKfTcly1fr393pxvf3j30j60d60v4 .jpg )
193+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d72b9f26a .jpg )
194194
195195请求都响应成功,库存确实也扣完了,但是订单却生成了 ** 124** 条记录。
196196
@@ -251,17 +251,17 @@ public class OrderServiceImpl implements OrderService {
251251
252252同样的测试条件,我们再进行上面的测试 ` /createOptimisticOrder/1 ` :
253253
254- ![ ] ( https://ws4.sinaimg.cn/large/006tKfTcly1fr39fxn691j31g603adgg .jpg )
254+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d72dab853 .jpg )
255255
256- ![ ] ( https://ws2.sinaimg.cn/large/006tKfTcly1fr39dlobs1j30ca042wej .jpg )
256+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d730800b1 .jpg )
257257
258- ![ ] ( https://ws2.sinaimg.cn/large/006tKfTcly1fr39dwfmrzj30f60gqgn7 .jpg )
258+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d73324dd2 .jpg )
259259
260260这次发现无论是库存订单都是 OK 的。
261261
262262查看日志发现:
263263
264- ![ ] ( https://ws2.sinaimg.cn/large/006tKfTcly1fr39hxcbsgj31kw0jhu0y .jpg )
264+ ![ ] ( https://i.loli.net//2019//05//08//5cd1daafb70bc .jpg )
265265
266266很多并发请求会响应错误,这就达到了效果。
267267
@@ -272,9 +272,9 @@ public class OrderServiceImpl implements OrderService {
272272- web 利用 Nginx 进行负载。
273273- Service 也是多台应用。
274274
275- ![ ] ( https://ws3.sinaimg.cn/large/006tKfTcly1fr39lm8iyjj31kw0ad784 .jpg )
275+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d752909b9 .jpg )
276276
277- ![ ] ( https://ws4.sinaimg.cn/large/006tKfTcly1fr39lvxnunj31kw0adaeh .jpg )
277+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d758c7714 .jpg )
278278
279279再用 JMeter 测试时可以直观的看到效果。
280280
@@ -418,11 +418,11 @@ echo "start $appname success"
418418通过 ` Druid ` 的监控来看看之前请求数据库的情况:
419419
420420因为 Service 是两个应用。
421- ![ ] ( https://ws1.sinaimg.cn/large/006tKfTcly1fr3a1zpp5lj31kw0h277s .jpg )
421+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d764221b5 .jpg )
422422
423- ![ ] ( https://ws3.sinaimg.cn/large/006tKfTcly1fr3a2c0vvdj31kw0g4n0m .jpg )
423+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d7676e1d2 .jpg )
424424
425- ![ ] ( https://ws4.sinaimg.cn/large/006tKfTcly1fr3a3xwslqj319g10cthl .jpg )
425+ ![ ] ( https://i.loli.net//2019//05//08//5cd1daeb0c306 .jpg )
426426
427427数据库也有 20 多个连接。
428428
@@ -554,15 +554,15 @@ Service 端就没什么更新了,依然是采用的乐观锁更新数据库。
554554
555555再压测看下效果 ` /createOptimisticLimitOrderByRedis/1 ` :
556556
557- ![ ] ( https://ws3.sinaimg.cn/large/006tKfTcly1fr3amu17zuj30e603ewej .jpg )
557+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d776c39b7 .jpg )
558558
559- ![ ] ( https://ws4.sinaimg.cn/large/006tKfTcly1fr3an1x3pqj30oy0fwq4p .jpg )
559+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d77ba16d2 .jpg )
560560
561- ![ ] ( https://ws2.sinaimg.cn/large/006tKfTcly1fr3aml0c8rj31ek0ssn3g .jpg )
561+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d780d5aa2 .jpg )
562562
563- ![ ] ( https://ws1.sinaimg.cn/large/006tKfTcly1fr3ank9otcj31kw0d4die .jpg )
563+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d784644d5 .jpg )
564564
565- ![ ] ( https://ws4.sinaimg.cn/large/006tKfTcly1fr3anxbb0hj31kw0cjtbb .jpg )
565+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d787b3e49 .jpg )
566566
567567首先是看结果没有问题,再看数据库连接以及并发请求数都有** 明显的下降** 。
568568
@@ -571,7 +571,7 @@ Service 端就没什么更新了,依然是采用的乐观锁更新数据库。
571571
572572其实仔细观察 Druid 监控数据发现这个 SQL 被多次查询:
573573
574- ![ ] ( https://ws3.sinaimg.cn/large/006tKfTcly1fr3aq7shudj31kw0bomzp .jpg )
574+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d78b3896a .jpg )
575575
576576其实这是实时查询库存的 SQL,主要是为了在每次下单之前判断是否还有库存。
577577
@@ -638,13 +638,13 @@ Service 端就没什么更新了,依然是采用的乐观锁更新数据库。
638638
639639压测看看实际效果 ` /createOptimisticLimitOrderByRedis/1 ` :
640640
641- ![ ] ( https://ws1.sinaimg.cn/large/006tKfTcly1fr3b419f2aj30by04g0ss .jpg )
641+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d78d659b6 .jpg )
642642
643- ![ ] ( https://ws2.sinaimg.cn/large/006tKfTcly1fr3b48vebkj30gk0cy0u3 .jpg )
643+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d790607a1 .jpg )
644644
645- ![ ] ( https://ws2.sinaimg.cn/large/006tKfTcgy1fr3b55kyv6j31kw0dijtx .jpg )
645+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d79307676 .jpg )
646646
647- ![ ] ( https://ws3.sinaimg.cn/large/006tKfTcgy1fr3b5n1n21j31kw0c2acg .jpg )
647+ ![ ] ( https://i.loli.net/2019/05/08/5cd1d7973de43 .jpg )
648648
649649最后发现数据没问题,数据库的请求与并发也都下来了。
650650
@@ -691,4 +691,4 @@ Service 端就没什么更新了,依然是采用的乐观锁更新数据库。
691691### 号外
692692最近在总结一些 Java 相关的知识点,感兴趣的朋友可以一起维护。
693693
694- > 地址: [ https://github.com/crossoverJie/JCSprout ] ( https://github.com/crossoverJie/JCSprout )
694+ > 地址: [ https://github.com/crossoverJie/JCSprout ] ( https://github.com/crossoverJie/JCSprout )
0 commit comments