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

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

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


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

相关文章
【YashanDB知识库】手工迁移Doris数据到崖山分布式
【YashanDB知识库】手工迁移Doris数据到崖山分布式
|
存储 分布式计算 负载均衡
数据分布式存储:在海量数据面前,我们如何站稳脚跟?
数据分布式存储:在海量数据面前,我们如何站稳脚跟?
1748 1
|
8月前
|
存储 监控 算法
117_LLM训练的高效分布式策略:从数据并行到ZeRO优化
在2025年,大型语言模型(LLM)的规模已经达到了数千亿甚至数万亿参数,训练这样的庞然大物需要先进的分布式训练技术支持。本文将深入探讨LLM训练中的高效分布式策略,从基础的数据并行到最先进的ZeRO优化技术,为读者提供全面且实用的技术指南。
836 2
|
数据采集 存储 NoSQL
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
1029 67
|
存储 人工智能 固态存储
DeepSeek开源周第五弹之一!3FS:支撑V3/R1模型数据访问的高性能分布式文件系统
3FS是DeepSeek开源的高性能分布式文件系统,专为AI训练和推理任务设计,提供高达6.6 TiB/s的读取吞吐量,支持强一致性保障和通用文件接口,优化AI工作负载。
2068 2
DeepSeek开源周第五弹之一!3FS:支撑V3/R1模型数据访问的高性能分布式文件系统
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
存储 分布式计算 Hadoop
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
579 7
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
383 5

热门文章

最新文章