分布式协调服务 ( 服务治理 ).

分布式协调服务 ( 服务治理 ).

1. 问题所在

  • 主要用于解决分布式环境中多个进程之间的同步控制, 让他们有序的去访问某种临界资源, 防止造成脏数据的后果.
订单服务JVM1->商品服务(库存五个): 我要五个
订单服务JVM2->商品服务(库存五个): 我要五个
订单服务JVM3->商品服务(库存五个): 我要五个
商品服务(库存五个)-->订单服务JVM1:给你五个
商品服务(库存五个)-->订单服务JVM2:给你五个
商品服务(库存五个)-->订单服务JVM3:给你五个

这个时候就造成了脏数据的问题, 库存变成了 \(-10\)

2. 解决方案

  • 分布式锁: 在第一个订单服务访问到商品服务的时候, 我们将商品服务加锁. 这个时候 第二个订单服务去访问 商品服务的时候会被拒绝.
  • 分布式协调的核心就是 实现分布式锁, 而Zookeeper就是分布式锁的实现框架.

分布式锁

1. 目的

  • 为了防止分布式系统中的多个进程之间的相互干扰, 我们需要一种分布式协调技术去对这些进程进行调度, 而这个分布式协调技术的核心就是来实现这个分布式锁, 而Zookeeper 就是分布式锁的实现框架 .

2. 完备条件

  • 在分布式系统环境下, 一个方法在同一时间只能被一个机器的一个线程执行.
  • 高可用的获取锁和释放锁.
  • 高性能的获取锁和释放锁.
  • 具备非阻塞特性 , 即没有获取到锁将直接放回获取锁失败.
  • 具备失效机制, 防止死锁. ( 在加锁以后因为发生某些意外, 这个时候可以让锁失效, 而不是一直持有锁, 造成死锁. )
  • 具备可重入特征(可以理解为重新进入, 由于多于一个任务并发适用, 而不必担心数据错误).

3. 常用方案

  • Memcached: 利用Memcached的add 命令. 此命令是原子性操作, 只有在key不存在的情况下, 才能add 成功, 也就意味着线程得到了锁.
  • Redis: 和Memcached的方法类似, 利用Redis的setnx命令. 此命令同样是原子性操作, 只有在key不为空的情况下,才能set成功.
  • Zookeeper: 利用Zookeeper的顺序临时节点, 来实现分布式锁和等待队列, Zookeeper设计的初衷,就是为了实现分布式锁.
  • Chubby: Google公司实现的粗粒度分布式锁服务,底层利用了Paxos一致性算法.

猜你喜欢

转载自www.cnblogs.com/A-FM/p/11435096.html