关于分布式系统中的并发问题

2020-01-16 16:11:35 +08:00
 Renco

问下各位,在分布式系统中,我的模块中的接口属于被调用的,用户的操作不会直接涉及我的模块,一般由其他模块调用我。这种时候我要如何考虑我模块中的并发问题。

我现在负责的会员模板有一个余额消费的功能,由订单模块,调用我会员消费,我只需要将订单模块传给我的消费金额和相关会员账号进行 扣款处理即可,项目经理让我排查一下其中出现的并发场景。但是我不太清楚分布式系统中的,并发问题是怎么产生的。

6926 次点击
所在节点    Java
40 条回复
xmh51
2020-01-16 16:15:23 +08:00
别人同一个订单重复调用怎么办?
fxxkgw
2020-01-16 16:16:22 +08:00
对于余额这种感觉说的像是幂等性 至于并发,他是不是只想说流量大的情况下,理论上并发这问题上游有负载,对业务来说压力大扩容就完事了。
matepi
2020-01-16 16:17:24 +08:00
要你的消费模块做一致性加锁,防止多个调用者并发调你消费的时候超余额消费呗
加锁,tcc 之类的呗
SpencerCJH
2020-01-16 16:35:03 +08:00
分布式事务一致性、幂等性、分布式锁 了解一下 :D
wellsc
2020-01-16 16:37:01 +08:00
流量激增,怎么平滑无痛扩容
xetv
2020-01-16 16:39:58 +08:00
同一个订单请求用测试工具并发请求 n 次看余额会不会变成负数
bobuick
2020-01-16 16:42:54 +08:00
单就扣款这个动作看,扣同一个账号下的款,是不是要求就是不能扣成负数?
那就 cas 乐观锁方式处理,或者 db 直接开 select for update 锁

你们扯上 tcc 是什么鬼,lz 只是要保障自己的模块安全就可以了.

要 tcc 之类的,就要联动你的订单模块一起从整体上来看架构了。你们这个没个架构师来把关么,不要随便用 tcc
phantomzz
2020-01-16 16:43:01 +08:00
4 楼正解,5 楼不知所云。

每个订单的扣款要考虑幂等,不能重复扣款。
模块中如果有多个消费者共享的资源,要考虑加锁或者 CAS,比如领券的场景。
RPC 调用,账户额度和订单状态要考虑一致性。
Renco
2020-01-16 16:55:42 +08:00
对于分布式系统来说 sychronize 锁是不是没有意义
phantomzz
2020-01-16 17:00:37 +08:00
@Renco Redis、Zookeeper 是比较常见的分布式锁实现方案。如果你们有现成的 redis 集群,可以了解一下 Redisson,借助 Redis 完全依照 Java 规范实现包括分布式锁在内的各种分布式工具。

借助其他实现了分布式一致性协议的组件也可以实现分布式锁。
justfly
2020-01-16 17:01:52 +08:00
但是我不太清楚分布式系统中的,并发问题是怎么产生的。

就你这个场景,两个对同一个用户的扣款请求,可能被路由到你服务的两个完全不相关的进程上,这两个进程内各自处理自己的扣款操作,比如是检查余额和扣款俩操作,二者均检查本次扣款余额充足没问题,结果可能会扣款变成负数。这时候就需要分布式锁来强制两个用户的扣款操作顺序进行。
Renco
2020-01-16 17:07:53 +08:00
@justfly 明白了,感谢
Renco
2020-01-16 17:08:06 +08:00
@phantomzz 好的,学习下,多谢
wangyzj
2020-01-16 17:08:13 +08:00
tcc
notwaste
2020-01-16 19:15:35 +08:00
好多大佬,学习了
index90
2020-01-16 20:10:18 +08:00
跟分布式系统没多大关系吧
即使你是单点的也会有并发问题啊
例如,我用同一个账号同时下了两个单
例如,我消费的同时对账号进行充值
对共享数据(余额)进行并发读写,要注意的是脏读脏写问题
FrankD
2020-01-16 20:47:01 +08:00
楼里瞎扯啥,一堆名词往上怼,人家说的是这个场景的吗
opengps
2020-01-16 21:12:31 +08:00
关键词:分布式锁。
多了不敢说,毕竟我经验不足
skypyb
2020-01-16 21:51:14 +08:00
来,给你两篇分布式锁的文章,一个 Redis 的,一个 Zookeeper 的
http://zhangtielei.com/posts/blog-redlock-reasoning.html
http://skypyb.com/2019/08/jishu/943/
CoderGeek
2020-01-16 21:56:48 +08:00
一般情况:
1.redis、zk、数据库行锁
2.是否幂等
3.条件如 version 版本号、余额是否可为负等

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/638475

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX