分布式系统的并发问题

精选30+云产品,助力企业轻松上云!>>> hot3.png

分布式系统除了带来显而易见的优势之外,还会引起一些比较难搞的麻烦,比如并发问题。

防止并发本质上就是要使程序串行化执行,以下列出部分可以解决这种问题的措施:

1、nginx

a、轮询(默认)

upstream servers {
    server 192.168.10.51:8388;
    server 192.168.10.52:8389;
}

 

b、weight,按权重分配请求

upstream servers {
    server 192.168.10.51:8388 weight=5;
    server 192.168.10.52:8389 weight=5;
}

 

c、ip_hash

upstream servers {
    ip_hash;
    server 192.168.10.51:8388;
    server 192.168.10.52:8389;
}

 

d、fair,按响应时间分配请求

upstream servers {
    server 192.168.10.51:8388;
    server 192.168.10.52:8389;
    fair;
}

 

e、url_hash

upstream servers {
    server 192.168.10.51:8388;
    server 192.168.10.52:8389;
    hash $request_uri;
    hash_method crc32;
}

 

f、backup

upstream servers {
    server host1:8388 weight=5 backup;
    server host2:8389 weight=10 max_fails=3 fail_timeout=30s;
}

 

2、tomcat

即在应用程序控制

使用volatile修饰符、synchronized关键字以及java.util.concurrent包下的类。但这仅限于单个tomcat容器内的并发控制。

3、数据库

a、数据库InnoDB的行级锁。

注意锁的作用范围越大,性能损耗越大。一般来说,只有明确指定主键,并且存在记录,才会锁定行。

b、查询语句手动加锁。

两种查询锁(共享模式和排它锁):

SELECT ... LOCK IN SHARE MODE sets a shared mode lock on the rows read. A shared mode lock enables other sessions to read the rows but not to modify them. The rows read are the latest available, so if they belong to another transaction that has not yet committed, the read blocks until that transaction ends.

SELECT ... FOR UPDATE sets an exclusive lock on the rows read. An exclusive lock prevents other sessions from accessing the rows for reading or writing.

测试:

SET AUTOCOMMIT=0; BEGIN WORK; SELECT quantity FROM products WHERE id=3 FOR UPDATE; ===========================================
此时products 数据中id=3 的数据被锁住(注3),其它事务必须等待此次事务 提交后才能执行
SELECT * FROM products WHERE id=3 FOR UPDATE (注2) 如此可以确保quantity 在别的事务读到的数字是正确的。 ===========================================
UPDATE products SET quantity = '1' WHERE id=3 ; COMMIT WORK;
===========================================

c、使用update语句的锁。

update ... set status = 1 where status = 0;

根据这条语句执行得到的影响行数,如果不为0,则表示本线程优先处理,接着执行下面的业务逻辑;否者则表明其他线程捷足先登了就放弃本次执行。

d、全局锁标识

先创建具体业务的全局锁,然后多线程争夺这个锁,执行完毕释放锁,保证业务代码串行化执行。

e、使用redis做分布式锁

主要命令:setnx、getset

持续更新...

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值