分布式锁的实现概述

做惯了讲究响应速度的微小化web服务,当有人给我讲分布式锁时深刻怀疑说这个名词的哥们要么准备给我挖坑,要么自己把架构玩脱了已经掉进了坑里。这个东西虽然常见,但是稍有不慎就会掉坑里出不来。

系统做的越多现在越来越害怕那种千钧一发的系统,动辄每秒单例服务响应web业务请求百万上下,这样的实现功力确实佩服,就是不知道服务宕机时的瞬时数据在恢复时能不能达到同样的速度了。从概率上来讲,服务器越多,发生问题的概率越小,再加上自己常人天资,最希望的就是一台服务器只处理一个请求-------当然这种开发富贵病也得治,不过那种炫技式的服务设计架构,除非是穷人家需要榨干服务器所有的算力,否则还是花点钱,多买几台服务器均摊开的好。可以照着秒发百万设计,但是最好贴着每秒负载上千的去玩。

扯远了。使用分布式锁就为了保证服务间数据一致性,那么这个锁怎么进行分布式?

把锁设置在各个服务点上就扯淡了,如果不讲究响应时间并且不担心系统复杂度,可以这么玩。首先在收到服务请求时发给所有同服务点发出广播,要求占用资源点,要求其他服务点暂停对这个资源点的请求。如果资源数据占用粒度比较小,那么还好,其他服务点可以采用队列堆积对着被占用的资源数据其中锁定的那一部分的请求,比如某个指定账户的积分。如果没有粒度区分,那就悲剧了,需要把所有资源的请求都堆积起来。请求完成,再发一次通知,并且还需要从堆积的请求里按照一定规则挑出新的请求服务点以避免死锁。如果不幸占用资源的服务挂掉了,还要再加一层根据时间条件的自旋锁机制,估计这样实现的话工程师都要哭了。所以,就别扯淡了。

把锁设置在数据资源服务本身上。比如直接利用关系型数据库的原子性事务或者redis自身的锁机制,这种是常见的利用方式,关系型数据库的响应速度可能会慢点,redis的响应速度相对好些。不过这种锁,尤其是关系型数据库有锁粒度过大的问题,通常是表级别锁,对并发性影响大,不适用于那种分分钟百万上下的。redis提供了一个分布式锁的算法https://redis.io/topics/distlock

请求队列。将所有请求都放置到 一个队列中先进先出,串行。这个方法虽然省事,但是不适用高响应系统大数据量系统,不然就是千钧一发,系统一旦宕机,恢复数据时估计想打人。当然,为了提高响应速度可以依据一定规则对资源数据进行划分,将请求队列切分为多个,但是需要保证队列间不能有请求资源交叉。

2和3的方式相结合,资源切分,请求归队,队列再次切分,利用redis作为资源存储,启用redis的锁算法,并且redis按照服务器进行数据存储划分而不是在一台服务器进行分片。2的架构在请求数未突破redis的瓶颈时还好,一旦突破则性能会陡峭下降。所以此方案单次响应时间相比较2会长一些,但是支持的吞吐量不会完全受限于redis的性能瓶颈并且可以通过队列服务增加来牺牲部分响应速度来降低性能下降速度,为redis划分负荷增加处理时间。当然,架构的层级划分也挺吓人,价格也挺好看的................

1到4都是可切分的,但是有些数据是不太容易切分的。容许请求失败的比如秒杀类的业务可以做切分,在子资源点数据不足时直接拒绝请求就可以了。但是面向成千上万用户发送积分并且积分有所预算的就不成了。当然,这个也可以切分,但是有后遗症,如果被请求的子节点数据不足,那么这个请求是不能认为失败的,需要将请求路由到资源充足的节点上,那么就需要在队列请求分发前进行一次预占用处理,保证请求真正发出时目标资源点的数据是能够满足的,如果不能还需要进行查找再进行路由。还有一种比较坑的情况,就是各个子节点的资源都不足,但是总量是满足,那么还需要继续再添加一层数据占用处理保障,对于突破子节点资源量的请求进行一套单独的处理,并且还需要选择预占用的节点进行预占用处理。

总结:

伴随着一种种情况,似乎CAP原则大显神威,但是情况没有绝对,从企业的角度出发,好的用户体验是一方面,但是数据的正确性则更加重要一些。可以通过对业务进行细致分析尝试将单次请求的资源需要量进行一些限制,反常则是妖,大多数的时候用户的需求还是常见,能够被系统一种较小的代价去实现出来。特定用户高频并且对资源大量请求的情况大多数来自与爬虫或者机器人,人类的信息单位处理能力还是有限。当然,一些特定领域的信息处理则要另当别论。

本文转载自:https://blog.csdn.net/xqj198404/article/details/81124177

原文地址:https://www.cnblogs.com/xiyunjava/p/9346751.html

时间: 2024-10-10 08:32:04

分布式锁的实现概述的相关文章

分布式锁概述

大型网站及应用都是分布式部署的,在分布式环境中的数据一致性问题一直是一个比较重要的话题,如何保证数据的一致性,那就离不开分布式锁.那么问题也就接踵而至.分布式锁有基于数据库的行数.redis以及zookeeper三种实现方式,同样是分布式锁,三者的区别何在?各自适用什么场景?一.场景 电商场景中的秒杀.抢购:保证产品不超卖. 比如是在分布式集群环境里,多个客户端同时修改一个共享的数据保证数据的一致性. 二.分布式锁的方案 基于数据库的行锁,有乐观锁.悲观锁. 使用redis来解决,也有乐观锁和悲

Redis分布式锁服务(转)

原文:http://www.cnblogs.com/mushroom/p/4752499.html 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj = new object(); lock (obj) { //操作共享资源 } 利用操作系统提供的锁机制,可以确保多线程或多进程下的并发唯一操作.但如果在多机环境下就不能满足了,当A,B两台机器同时操作C机器的共享资源时,就需要第三方的锁机制来保证在分布式环境下的资源协调,也称分布式锁. Redi

Redis分布式锁服务(八)

阅读目录: 概述 分布式锁 多实例分布式锁 总结 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj = new object(); lock (obj) { //操作共享资源 } 利用操作系统提供的锁机制,可以确保多线程或多进程下的并发唯一操作.但如果在多机环境下就不能满足了,当A,B两台机器同时操作C机器的共享资源时,就需要第三方的锁机制来保证在分布式环境下的资源协调,也称分布式锁. Redis有三个最基本属性来保证分布式锁的有效实现: 安全

ZooKeeper分布式锁浅谈(一)

一.概述 清明节的时候写了一篇分布式锁概述,里面介绍了分布式锁实现的几种方式,其实那时候我一直沉迷于使用redis的悲观锁和乐观锁来实现分布式锁,直到一个血案的引发才让我重新认识了redis分布式锁的弊端,所以才痛定思痛潜心研究Zookeeper:自己装了三台Centos虚拟机,搭建了ZooKeeper集群.二.ZooKeeper基本概念1.前言 ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现.分布式应用程序可以基于 ZooKeeper 实

使用Redisson实现分布式锁,Spring AOP简化之

源码 Redisson概述 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid).它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务.其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publi

分布式锁与实现(一)——基于Redis实现

概述 目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们"任何一个分布式系统都无法同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项."所以,很多系统在设计之初就要对这三者做出取舍.在互联网领域的绝大多数的场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证"最终一致性",只要这

高性能分布式锁-redisson的使用

1,概述:在一些高并发的场景中,比如秒杀,抢票,抢购这些场景,都存在对核心资源,商品库存的争夺,控制不好,库存数量可能被减少到负数,出现超卖的情况,或者 产生唯一的一个递增ID,由于web应用部署在多个机器上,简单的同步加锁是无法实现的,给数据库加锁的话,对于高并发,1000/s的并发,数据库可能由行锁变成表锁,性能下降会厉害.那相对而言,redis的分布式锁,相对而言,是个很好的选择,redis官方推荐使用的Redisson就提供了分布式锁和相关服务. 下面介绍下如何使用Redisson. 2

Zookeep 分布式锁

什么是分布式锁 概述 为了防止分布式系统中的多个进程之间相互干扰,我们需要一种分布式协调技术来对这些进程进行调度.而这个分布式协调技术的核心就是来实现这个分布式锁. 分布式锁应具备的条件 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行 高可用的获取锁与释放锁 高性能的获取锁与释放锁 具备可重入特性 具备锁失效机制 具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败 分布式锁有哪些实现 Memcached:利用 Memcached 的 add 命令.此命令是原子性操作,只有在

【Zookeeper】分布式锁

一.概述 实现原理 实现代码 一.概述 分布式锁解决方案(目的:为了保证在分布式领域中共享数据安全问题) 数据库实现分布式锁(不推荐.效率特别低) 基于Redis实现分布式锁setNx (非常麻烦考虑死锁.释放问题) .redission分布式锁 基于Zookeeper实现分布式锁(强烈推荐) SpringCloud内置实现全局锁(冷门)实现起来非常简单,使用临时节点释放锁(效率最高).失效时间容易控制 分布式锁(产生的原因:因为服务器产生集群) 在单台服务器上如何生成订号( 保证唯一) UUI