Go微服务: 理解分布式锁

概述

  • 我们先看一个场景,到了双11,我们的商户又开始卖商品啦
  • 但是,我们的库存是有限的,如果超卖了,可能平台就会涉及相关法律责任了
  • 所以,我们的库存扣除问题,一定是一个非常经典的问题
  • 先看上图,我们库存服务部署在一台机器上,现在有 2个 Goroutine
  • 这个库存是被并发读取的,但是读取后扣除明显是一个异步的问题
  • 用 Goroutine 来模拟并发, 2个Goroutine 分别是G1, G2 都去下单,扣减库存
  • 一共100件,2个Goroutine查询的时候很可能都还是100
  • 在计算扣除的时候都是 100 - 10 = 90 这个肯定不对,应该最终的结果是 80
  • 引发这个问题的原因是:并发查询和扣减一起操作,无法得到时时的真实的数据
  • 当时查询的数据和时时的数据并不是同一个数据
  • 现在,我们用分布式锁来解决这个问题
  • 分布式锁好比一个独立的第三方,是可信任的,从计算机角度来说,这是一把锁
  • 我们约定谁拿到了这把锁就可以扣减库存,查询库存
  • 在查询之前先获得锁,没有锁你连查询都不能查询,就可以保证顺序执行
  • 抢到了锁,执行完自己的操作,就要释放锁

分布式锁的发展

  • 上面蓝色的圈代表2个 Goroutine
  • 现在的场景是在一个服务器上,在服务器上会有一些服务,其中2个服务都有 Goroutine
  • 我们的这个锁是操作系统提供的,它针对的是操作系统的这把锁
  • 这是一开始go语言当中的这一部分锁的范畴
  • 再看这张图,当我们一台服务器不够的时候,比如双11活动, 这种一台服务器,它肯定是扛不住的
  • 在我们这个订单的web服务问题下,在多个服务器集群的场景下,Goroutine 不能实现跨服务器的锁
  • 因为是两个完全物理隔绝的服务器,两个完全不一样的硬件,为了高并发,必须提供更多的服务器
  • 为了解决这个问题,分布式锁应运而生
  • 看这里简化的图,就是说服务器一和服务器,我们这个锁并不在服务器上,是单独的一把锁
  • 这个锁不属于任何一个服务器,是一个公共的第三方,任何服务抢到就可以优先执行任务
  • 就是说你这个服务器1和服务器2,谁先抢到这把分布式的锁,谁就执行这个任务
  • 各个服务器都是平权的,要想争夺公共的资源,谁优先抢到了,就是谁的

常见的锁和分布式锁的区别


1 ) 常见的锁

  • 第一个就是golong程序里面用到的锁
    • Mutex 互斥锁,也叫独占锁,就是我占有了你就不能占有,除非被释放
    • RWMutex 读共享,写互斥的锁, 当大家一起读的时候,这个锁的性能是不错的,如果是写,就是互斥的
      • 适合读多写少的场景,比如读博客人多,写博客人少;看视频人多,发视频人少
    • 以上是golang程序中两种类型的锁
  • 第二个是 mysql 里面的 悲观锁和乐观锁
    • 这都是赋予人的这种情绪上的描述
    • mysql里一般有什么锁呢?排他锁, 共享锁,表锁,行锁等等,这些呢就容易混
    • 1 )而这里的悲观锁是一种从思想上处理并发的一种方式
    • 比如,悲观所和某人性格有关,比如这个人就是悲悲的,他总是负面情绪很大
    • 就是没有什么正能量,在数据库里也是一样,总是会认为会和别人发生冲突,总觉别人会修改它的数据
    • 既然这样,我就在修改的时候,拿一把锁给他锁住,别人谁也别想用,就是这么个情绪
    • 通常这把锁就是排他锁,因为说只有我能用,别人不能用,别人能用,我就不能用,它就是一个排他的
    • mysql的悲观锁对应一句笑话:“总有刁民想害朕”,就是一直觉得总有人和我竞争,抢夺资源
    • 2 )与之相对应的就是说乐观锁,它就是赋予人的这种乐观情绪,什么事也不放在心上。
    • 但是mysql它一定要解决这个数据的竞争问题,乐观锁用一个version字段去记录这一条记录
    • 这记录,大家都可以修改,但总有一人会修改成功,与 version 匹配的,在某些场景下比悲观锁好一些
    • 但是,有的时候也分业务场景,具体的性能要根据压测,很多在上线之前都会有压测和相关指标
    • 在编码阶段不会超过整个产品研发三分之一的时间,其他的时间可能在
    • 准备环境,准备case,准备压测的case,还有性能,还有监控,还有的运维,以及应对后续突发流量等
    • 很多预案都要考虑到,并不是说我们把代码写完了就结束了

2 ) 分布式锁

  • 第三个是redis的分布式锁
    • 这是在mysql的库存服务的一张表,它的 id 是66,数量是100
    • 库存服务1想要拿到id是 1 的这个记录的锁
    • 库存服务2也想要拿到id是 1 的这个记录的锁
    • 这个锁是mysql提供的,悲观锁它就是一个互斥锁
    • 如果你用悲观锁,那就是永远是这么一个服务,被一方拿到之后就被锁定
    • 只有一方执行完了,退出了,才会被其他服务锁定
    • 如果有更多的服务,就排队一个一个来
    • 谁抢到,谁先执行,抢不到就在旁边等着
    • 所以它不适合并发场景要求相对高的情况

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/697346.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW电池测试系统

1. 背景 随着电动汽车、可再生能源等领域的迅速发展,电池作为能源储存和释放的核心组件,其性能评估变得尤为重要。电池的充放电性能、容量、循环寿命等参数直接影响着设备的工作性能和使用寿命。因此,设计一套全面、准确的电池测试系统对于提…

orbslam2代码解读(2):tracking跟踪线程

书接上回,mpTracker->GrabImageMonocular(im,timestamp)函数处理过程: 如果图像是彩色图,就转成灰度图如果当前帧是初始化的帧,那么在构建Frame的时候,提取orb特征点数量为正常的两倍(目的就是能够在初…

Android JobService启动系统源码分析

以下就JobService的执行流程,系统层实现进行详解 入口点在JobScheduler.scheduler 系统层JobScheduler是个抽象类,它的实现类是JobScheduler mBinder,一看就知道这里面肯定是跨进程了。它的服务端在JobSchedulerService里面,具体 为什么请看系统服务器启动流程相关文章,…

【传知代码】上下位关系自动检测方法(论文复现)

前言:在信息爆炸的时代,我们每天都沉浸在海量的数据和信息中。随着互联网技术的飞速发展,如何从这些信息中准确、高效地提取出有用的知识,成为了当下研究的热点。其中,上下位关系(也称为层级关系或种属关系…

康姿百德集团公司官网床垫价格透明,品质睡眠触手可及

选择康姿百德床垫,价格透明品质靠谱,让你拥有美梦连连 在当今社会,良好的睡眠质量被越来越多的人所重视。睡眠不仅关系到我们第二天的精力状态,更长远地影响着我们的身体健康。因此,选择一款合适的床垫对于获得优质睡…

Android Studio Jellyfish版本修改project使用特定jdk版本的步骤

android studio总是把这些东西改来改去让人十分恼火,IDE本身改来改去就让人无法上手就立即工作,很多时间浪费在IDE和gradle的配置和奇奇怪怪现象的斗智斗勇上,搞Android是真的有点浪费生命。一入此坑深不见底 jellyfish版安卓studio已经无法通…

Python模块导入,别out了,看看这些高级玩法!

目录 1、基础导入:import语句 📚 1.1 直接导入模块 1.2 导入模块别名 1.3 从模块导入特定属性 2、高级导入:from...import 🧰 2.1 选择性导入模块成员 2.2 嵌套模块导入 2.3 避免命名冲突策略 3、动态导入:imp…

Mysql基础-多表查询

Mysql基础-多表查询 文章目录 Mysql基础-多表查询1 多表关系1.1 一对多1.2 多对多1.3 一对一 2 多表查询概述2.1 多表查询分类 3 内连接4 外连接5 自连接6 联合查询-union union all7 子查询7.1 标量子查询7.2 列子查询7.3 行子查询7.4 表子查询 1 多表关系 项目开发中&#xf…

Jenkins构建打包部署前端Vue项目至Nginx

一. 安装jenkins 基于DockerJenkins实现自动部署SpringBootMaven项目-CSDN博客 二. 安装NodeJs插件并配置 显示上面两行则表示安装成功, 然后回到首页, 点击’系统管理’->‘全局工具配置’: 配置node.js 三. 创建jenkins项目 1、创建项目 2、配置gitee 3、配置源码 4、…

网络学了点socket,写个聊天室,还得改进

目录 第一版: common 服务端: 客户端 第一版问题总结: 第二版 服务端: 客户端: 改进: Windows客户端 一些小问题 还可以进行的改进 这篇文章我就先不讲网络基础的东西了,我讲讲在我进行制作我这个拉跨聊天室中遇到的问题,并写了三版代码. 第一版: common #pragm…

MyBatis映射器:实现动态SQL语句

大家好,我是王有志,一个分享硬核 Java 技术的金融摸鱼侠,欢迎大家加入 Java 人自己的交流群“共同富裕的 Java 人”。 上一篇文章中,我们已经学习了如何在 MyBatis 的映射器中通过简单的 SQL 语句实现增删改查,今天我…

关闭windows11磁盘地址栏上的历史记录

关闭windows11的磁盘地址栏上的历史记录 windows11打开磁盘后访问某一个磁盘路径后会记录这个磁盘路径,而且有时候会卡住这个地址栏(关都关不掉),非常麻烦。 如下图所示: 关闭地址栏历史记录 按下windows键打开开…

C++面试八股文:static和const的关键字有哪些用法?

100编程书屋_孔夫子旧书网 某日二师兄参加XXX科技公司的C工程师开发岗位第7面: 面试官:C中,static和const的关键字有哪些用法? 二师兄:satic关键字主要用在以下三个方面:1.用在全局作用域,修饰的变量或者…

Adobe Premiere Pro 2024下载安装(视频剪辑软件Pr2024)

百度网盘下载地址(含PR教学课程(PR从入门到精通108节课程))https://pan.baidu.com/s/1WKYZENoMzTcKhbgMgbEPGQ?pwdSIMS 一、Pr简介 Pr全称Premiere,是Adobe公司开发的一款功能强大的视频剪辑软件,目前被…

Java实现物候相机和植被分析导出相对指数成果图

一、基础概念 植被分析是利用地理信息系统(GIS)、遥感技术、生态学、环境科学等多学科交叉手段,对植被的分布、类型、结构、组成、动态变化、生产力、生态功能进行量化评估的过程。植被分析对于生态保护、生物多样性研究、资源管理、环境监测…

Mysql基础 - 事务

Mysql基础 - 事务 文章目录 Mysql基础 - 事务1 事务简介2 事务操作2.1 控制事务一2.2 控制事务二 3 事务四大特性4 并发事务问题5 事务隔离级别 1 事务简介 事务是一组操作的集合,他是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提…

[chisel]马上要火的硬件语言,快来了解一下优缺点

Chisel是什么? Chisel的全称为Constructing Hardware In a Scala Embedded Language,是一个基于Scala的DSL(Domain Specific Language,特定领域专用语言)。2012年,加州大学伯克利分校(UC Berkel…

【Rd-03E】使用CH340给Rd03_E雷达模块烧录固件

Rd03_E 指导手册 安信可新品雷达模组Rd-03搭配STM32制作简易人体感应雷达灯教程 http://t.csdnimg.cn/mqhkE 测距指导手册网址: https://docs.ai-thinker.com/_media/rd-03e%E7%B2%BE%E5%87%86%E6%B5%8B%E8%B7%9D%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C%E4%B8%AD%…

02-JAVA面向对象编程

一、面向对象编程 1、面向过程编程思想(Process Oritented Programming) 将实现一个功能的一组指令组合在一起,成为一个函数。这个函数就能实现这一个功能,是对功能实现的一种抽象。通过这种抽象方式,将代码实现复用。…

软件游戏steam_api.dll丢失的解决方法,总结5种有效的方法

在玩电脑游戏时,我们经常会遇到一些错误提示,其中之一就是“游戏缺少steam_api.dll”。这个问题可能让很多玩家感到困惑和烦恼。那么,究竟是什么原因导致游戏缺少steam_api.dll呢?又该如何解决这个问题呢?本文将为大家…