分布式
分布式/集群
与 单体
不同主要在于并发问题
分布式并发问题
分布式并发问题主要是指在分布式系统中,由于多个节点之间的并发操作,可能会导致数据不一致、状态不一致等问题。
example
后端设置
先把application再运行一个
一个运行在8081端口,另一个运行在8082端口
前端设置
在nginx.conf
中设置负载均衡
1 |
|
nginx
的反向代理和负载均衡默认使用轮询
的方式
测试
启动两个后端服务
启动前端服务
打开浏览器,多次访问
http://localhost:8080/api/voucher/list/1
查看两个后端服务的日志
可以看到请求是交替到两个后端服务的
并发问题
使用两个相同用户访问http://localhost:8080/api/voucher-order/seckill/7
进行秒杀下单时,看到数据库减少了两条数据
但是实际上只应该减少一条数据
这就是并发问题
在分布式系统中,由于多个节点之间的并发操作,可能会导致数据不一致、状态不一致等问题
在这个例子中,两个请求同时访问了/api/voucher-order/seckill/7
,导致两个请求都成功下单了
原理
在单体应用中,使用的synchronized
关键字来保证线程安全,注意此时单独的jvm
,所以锁监视器只有一个,可以监控到哪个线程获取到锁,哪个线程没有获取到锁,保证线程安全
而在分布式系统中,由于存在多个jvm
,所以锁监视器是分开的,在对应的jvm
中能够监控到哪个线程获取到锁,哪个线程没有获取到锁,但是在不同的jvm
中是无法监控到其他jvm
中的线程的,所以在分布式系统中,使用synchronized
关键字是无法保证线程安全的
解决方案
使用唯一锁监视器来监控全部的jvm
中的线程
在分布式系统中,使用redis
的分布式锁来保证线程安全…