前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么业务面试总问“乐观锁”

为什么业务面试总问“乐观锁”

作者头像
35岁程序员那些事
发布2022-09-23 17:59:06
2270
发布2022-09-23 17:59:06
举报

“乐观锁”是咱们程序员在面试的过程中经常会碰到的,那么这里我们来聊一下它的重要性。

乐观锁与高并发

如果面试官和你聊“乐观锁”,那么大概率是要延展到“高并发”。技术人都知道“乐观锁”适合“读多写少”的业务场景,并且可以较大程度的提高业务接口的吞吐量,还能保证数据一致性,从这个角度上来看,它是真的太香了。当然这里的香是相对于“悲观锁”而言的。

是不是使用“乐观锁”之后,我们的业务接口就可以高枕无忧了呢?答案是否定的,乐观锁只是降低了“悲观锁”的锁冲突的概率,或者简单的说是为了延缓锁冲突。

使用乐观锁会带来哪些技术风险呢?

  • 如果是框架实现的乐观锁,框架都会有统一的乐观锁异常机制,乐观锁冲突次数达到阈值之后,会触发异常机制,并将异常显示的抛给业务服务。如果业务服务,没有正确的处理这个异常,则会影响业务服务接口的可用性;
  • 如果是自研的,则需要针对“乐观锁”做好超时调用和异常机制的可用性保护措施。

当业务服务的并发量上来之后,“乐观锁”反而成为影响业务服务吞吐量的定时炸弹,为什么要这么说呢?咱们可以这样想,10个线程处理一行数据,只能有一个线程处理成功,其他9个全是失败的。假如,你处理的数据是热点数据,同时有10000个线程在处理热点数据,造成锁冲突的概率是非常高的。并且还有一个致命的问题,那就是“乐观锁”的流量会触及到系统资源,也就是会真实的暂用业务服务的系统资源,而“悲观锁”从应用层就拦截了业务流量。

所以这个就解释了“为什么乐观锁适合读多写少”的问题,主要目的是“既要提高业务接口的并发性,也要减少锁冲突带来的不必要的性能损耗,尤其是并发量非常高的业务场景”。

但是真实的业务场景中,尤其是中小型公司,业务接口并发量能够达到100或者1000就已经很不错了,你想想,一个订单接口,并发量达到1000是什么概念,老板估计都是偷者数钱了。

面试官聊“乐观锁”,就是要考察咱们程序员的“高并发”的处理能力。

乐观锁与性能

上面说到了“乐观锁”在一定的并发量之后,会严重的影响业务接口的可用性,甚至会拖慢整个微服务体系。那么问题来了,我们如何检测这个“并发量的阈值了”,这个也是面试官希望候选人知道的知识点。

咱们的业务接口在使用“乐观锁”之前和之后,接口性能有多少提升,这些都是程序员在使用“乐观锁”之后需要考虑的。

好吧,如果是笔者,笔者会使用压测工具来压测性能,并得出接口的性能指标。与此同时,会结合全链路追踪系统,实时的追踪“添加了乐观锁”之后的业务和业务上下游的其他业务服务的线上运行指标。这样我们就可以充分的了解接口的性能,并结合峰值和峰谷阶段的并发度和性能指标,动态的调整接口的超时时间、乐观锁失败的重试次数等等。当然这个规则的调整都是实时的,业务服务是可以感知的。

乐观锁与数据

为什么说“乐观锁”与数据关系很大了,因为咱们使用“乐观锁”就是为了保护我们数据的一致性,所以如果聊乐观锁,肯定会考察与数据相关的知识点,比如MySQL的锁,ElasticSearch的乐观锁等等,其实还有很多大数据框架底层也采用了乐观锁,比如Spark等,只是实现乐观锁的形式不太一样,有些是使用Version,有些是使用时间戳。

这么说“乐观锁”如果往前延伸,那就是涉及到数据处理了,好吧,从面试官的角度去看这个确实是一个好问题。

公众号初衷

知识输出是笔者的初衷,借助知识输出,能够认识更多的牛人,能够和牛人沟通,也是自己技术提升的一个机会。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构随笔录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档