学会用数据说话-分布式锁究竟可以多少并发?

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 学会用数据说话-分布式锁究竟可以多少并发?

程序员萌萌在浏览关于分布式锁的文章,突然下面的话引起了萌萌的注意:


12132328-4802eb3d8b6afd16.jpg

12132328-6c1625ac24811700.jpg


12132328-a5eca14c25155d74.jpg


在锁操作的客户端打日志


获取锁:


T13:31:51.230redisname-lock:hsetnx
E13:31:51.230GetConnection10.X.X.X
T13:31:51.231redisname-lock:hsetnx


设置超时时间:


T13:31:51.230redisname-lock:hsetnx
E13:31:51.230GetConnection10.X.X.X
T13:31:51.231redisname-lock:hsetnx


释放锁:


T13:31:51.230redisname-unlock:hsetnx
E13:31:51.230GetConnection10.X.X.X
T13:31:51.231redisname-unlock:hsetnx


从上面数据可以看到一个正常分布式锁操作,操作时间在1ms,因为是从客户端获取的,因为粒度只能是毫秒级。再从服务端看看是什么情况。



微信图片_20220426213028.jpg


微信图片_20220426213059.jpg


上面显示了大于1ms的慢查询情况,可以看到每秒几百个的QPS不会造成分布式锁本身的慢查询。耗时超过1ms的都是集群操作,分布式锁的lock和unlock操作时间都是us级。

   如果lock和unlock中间没有任何逻辑的理想情况下,同一个锁可以支持每秒:


  1000ms/ (1ms的lock+1ms的设置超时+1ms的unlock)=333(个)


结论


分布式锁本身lock和unlock耗时是us级,在理想情况下大概可支持每秒1000个原子操作,300多个从分配到释放流程结束。


12132328-17f83f92bd0f5c5f.jpg


举个栗子🌰:


秒杀场景下,秒杀的产品有1000件。如果使用了分布式锁,理想情况下可以在1m内处理完所有的秒杀成功请求,其他请求直接返回秒杀结束。


既然秒杀都没有问题,一般情况下,分布式锁不会是性能瓶颈。如果出现了性能问题,首先先排查业务逻辑。


12132328-d4b2927e3cda0361.jpg


目录


1:一个线程里lock成功,unlock失败?


2:有哪些抓手可以确定哪些逻辑耗时太多?


3:锁内部要避免的操作有哪些?


4:循环获取锁的时间间隔怎么算合理?


5:获取锁重试次数怎么算合理?


6:多次获取锁失败原因有哪些?


7:加了分布式锁还出现了并发问题?


1:一个线程里lock成功,unlock失败?


Q: 日志里报了多次的unlock失败,什么原因?


A: 之前的代码里try finally模式的unlock,是否lock成功都会unlock。


Q:加上了lock成功才unlock,还是有unlock失败?


A:这是锁住的逻辑耗时太多,超过了expire的时间,自动释放锁了。


2:有哪些抓手可以确定哪些逻辑耗时太多?


Q: 日志可以吗?


A: 目前的日志可以找到有问题的traceId,看整个链路都进行了哪些处理,大概几步时间消耗,但是具体sql的耗时分析没有


Q:CAT监控可以吗?


A:CAT监控可以找到耗时多的几个请求,看到每条sql的耗时情况,超过5秒的sql都是需要注意的


3:锁内部要避免的操作有哪些?


Q:逻辑上的?


A:避免显式的和隐式的循环。如:.stream().


Q:性能上的?


A:数据查询的条件是否建立了索引


4:循环获取锁的时间间隔怎么算合理?


A:获取锁与服务器通讯时间可以忽略不计,在跨机房的情况下理论上也不超过2ms

所以锁可以获取到的时间=一段分布式锁中间执行时间平均值


5:获取锁重试次数怎么算合理?


A:获取锁的重试次数理论上如果获取锁时间间隔合理的话,就与允许的同时扩容最大容器数接近,不大于最大容器数20%。


6:多次获取锁失败原因有哪些?


A:如果不符合可获取到的时间间隔计算,则考虑是否特定场景下有耗时操作。具体可参考 3:锁内部要避免的操作有哪些?


7:加了分布式锁还出现了并发问题?


Q:锁获取失败是怎么处理的?


A:锁获取失败并没有按请求失败处理,而是在无锁状态下继续执行会引发并发问题。


Q:锁获取成功了还是出现并发问题?


A:执行太慢了,超过了expire的时间锁失效了。

 

12132328-9269880e3e02c082.png

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
12天前
|
人工智能 数据管理 大数据
探索分布式系统中的数据一致性与并发控制
【2月更文挑战第8天】在当今互联网时代,分布式系统的概念越来越广泛应用于各种应用场景中。本文将深入探讨分布式系统中数据一致性与并发控制的重要性和挑战,介绍常见的解决方案以及未来发展趋势。
|
12天前
|
SQL 算法
基于若依的ruoyi-nbcio流程管理系统修改代码生成的sql菜单id修改成递增id(谨慎修改,大并发分布式有弊端)
基于若依的ruoyi-nbcio流程管理系统修改代码生成的sql菜单id修改成递增id(谨慎修改,大并发分布式有弊端)
22 1
|
12天前
|
消息中间件 算法 Java
三面“有赞”Java岗斩获offer:Spring+JVM+并发锁+分布式+算法
年末离职,年初为面试也筹备挺长一段时间,找了不少复习资料,刷了很多题在网上投了很多简历最终面试了有赞,还有幸拿到offer!
|
7月前
|
NoSQL 算法 Redis
Redis学习笔记-并发控制&分布式锁
Redis学习笔记-并发控制&分布式锁
53 0
|
9月前
|
消息中间件 算法 Java
三面“有赞”Java岗斩获offer:Spring+JVM+并发锁+分布式+算法
年末离职,年初为面试也筹备挺长一段时间,找了不少复习资料,刷了很多题在网上投了很多简历最终面试了有赞,还有幸拿到offer!
|
11月前
|
消息中间件 开发框架 NoSQL
【工作中问题解决实践 二】分布式消息并发同步处理方案
【工作中问题解决实践 二】分布式消息并发同步处理方案
87 0
并发场景下的幂等问题——分布式锁详解-附录
并发场景下的幂等问题——分布式锁详解
|
存储 缓存 NoSQL
并发场景下的幂等问题——分布式锁详解
并发场景下的幂等问题——分布式锁详解
122 0
|
存储 缓存 Kubernetes
实战并发-使用分布式缓存和有限状态机
实战并发-使用分布式缓存和有限状态机
实战并发-使用分布式缓存和有限状态机
|
Java
ZooKeeper 分布式锁 Curator 源码 03:可重入锁并发加锁
在了解了加锁和锁重入之后,最需要了解的还是在分布式场景下或者多线程并发加锁是如何处理的?
116 0

相关实验场景

更多