当前位置: 首页 > news >正文

【腾讯云 Cloud Studio 实战训练营】Redisgo_task 分布式锁实现

文章目录

  • 前言
    • 问题场景
    • 腾讯云 Cloud Studio
  • Redisgo_task
    • 长短类型分布式场景介绍
    • Redisgo_task实现原理
      • SetNx(value+expire)原子性
      • 子协程Done()时间点
      • 子协程中的Ticker
    • Redisgo_task唯一外部依赖
    • Redisgo_task Lock结构
    • Redisgo_task架构健壮性设计
      • Redisgo_task可扩展性
      • Redisgo_task灵活性
      • Redisgo_task可读性
      • Redisgo_task健壮性
    • Redisgo_task性能指标
    • Q&A
    • 附:
      • 产品设计思路借鉴

前言

问题场景

随着云技术的成熟,各大厂商为提升服务质量、降低生产成本、加快产品迭代效率,都提倡服务上云,分享云技术带来的便利。

而作为开发人员,总会被这样的问题时不时烦恼:接手或搭建项目时,由于自身机器的环境变量、sdk 包版本、等因素,导致服务无法正常启动、或者是在本地搭建环境需要依赖多种基础存储、组件,小小的 Mac 几G的存储完全 Hold 不住,尤其涉及算法同学感受极深、或者压根都不想把公司的代码库放到自己的电脑上,弄的公私不分…
在这里插入图片描述

其实,不光是研发人员,领导们也很纠结,怕存在代码泄漏、等安全问题。

针对这种特有场景,云提供了一种简单、便捷的解决方案。在解决研发问题的同时,也规避了某中安全问题,甚至提升了功能交付效率。

下面给大家介绍 腾讯云 Cloud Studio ,一种 “在线编程 · AI-辅助开发” 云上工具。

腾讯云 Cloud Studio

  • 官网地址:https://wx.cloudstudio.net/dashboard/workspace

在这里插入图片描述
在现阶段提供的模版中,存在 30+ 的初始模版,包含 框架模板、云原生模板、建站模板 多种代码库。在功能完全对齐传统的 IDE 模式的基础上,提供 AI 智能组件支持,进一步解放研发的成本。

Redisgo_task

一款基于Goland语言实现的Redis分布式锁产品,支持百万级实例/协程并发,适用于各种常见的分布式场景。

在这里插入图片描述

长短类型分布式场景介绍

目前业务中分布式锁场景依据任务对象所需的Occupied Time可分为两种:短任务类型、长任务类型

长任务类型

任务A需要在很长的一段时间占有锁,这个时间未知,直至任务A结束,甚至特殊情况下A的周期为业务的全生命周期,才能释放锁,再供任务A/B/C/D/争抢;

短任务类型

任务A在极短的时间内可完成,可在已知的时12:12:10间阈值内,释放锁,再供任务A/B/C/D/争抢;

实质上

两种类型都是对分布式场景下公共资源的一致性保证;

功能上

长任务类型更倾向于实现某单实例的动态切换,如解决实例单点问题等;

短任务类型更倾向于对时刻高并发的限制,如短时间内的流量控制等

Redisgo_task两种任务类型都支持。

Redisgo_task实现原理

基于Redis SetNx()方法进行封装,创建子协程监听任务执行状态,任务执行中频次拉取Luck的Expire,当Expire在配置的阈值范围内,持续增加Expire,从而确保Luck在任务进行中不会过期。

SetNx(value+expire)原子性

lock.Conn.Do(“SET”, lock.Key, lock.Token, “EX”, int(lock.TimeOut), “NX”)

子协程Done()时间点

由doneCh <-chan struct{} Channel阻塞控制,在Unlock()中会出发Close()信号

子协程中的Ticker

通过Ticker,持续进行Expire Add操作,可有效避免阻塞及单次Expire Add失败的场景,且有效验证当前锁状态,及时Stop

Redisgo_task唯一外部依赖

dir:config/redisgo_task.toml
[redis]
host = "10.13.40.145:26380"
key = “Redisgo_Task_Consul_Lock_key"
# value = "8292884c-a7a7-0050-9778-e47362a8f578"
# expire = "500ms"
# retries = "10ms"
# cron = "10ms"

Redisgo_task Lock结构

type RedisLock struct {Host           stringExpire         time.DurationKey            stringValue          stringConn           redis.ConnCron           time.DurationTries          time.DurationDoneExpireChan chan struct{}
}
#expire-锁默认expire「单位s」
#retries重试获取锁间隔
#cron 持续增加expire频次

Redisgo_task架构健壮性设计

考量到产品架构在实用中的健壮性,针对产品的整体架构设计,对实现过程做出了一下方向的调整:

Redisgo_task可扩展性

对功能实现过程依赖的参数,及功能函数进行封装成不同程度的Struct、Interface,方便后期功能扩展

Redisgo_task灵活性

对产品功能涉及到的主要环节阈值拆分,抽象为依赖,支持外部配置化,且作为唯一入口,依据实际场景调整,保证配置的灵活性及功能最细粒度的控制

Redisgo_task可读性

在产品功能实现过程中,添加完整的日志输出,确保逻辑的清晰可读,降低产品的上手难度

Redisgo_task健壮性

在产品功能实现过程中,添加并进行了充分的单元测试

package lockimport ("fmt""testing"
)func TestRetriesTime(t *testing.T) {var testTry = NewRetry(0,0,false)fmt.Printf("Test 1 res:%v\n", testTry.RetriesTime())fmt.Printf("Test 2 res:%v\n", testTry.RetriesTime())fmt.Printf("Test 3 res:%v\n", testTry.RetriesTime())fmt.Printf("Test 4 res:%v\n", testTry.RetriesTime())fmt.Printf("Test 5 res:%v\n", testTry.RetriesTime())fmt.Printf("Test 6 res:%v\n", testTry.RetriesTime())}

Redisgo_task性能指标

在数据量、实例数量两个维度验证:在高并发场景下每个实例获得锁的成功率一致;

实验分为三组,分别为样本一、样本二、样本三如下图;

在这里插入图片描述

样本一中数据规模每组在10+,较少,两组成功率相差4.2%,无法体现在双实例下,每个实例成功率一致的目标;

样本二中数据规模每组在3w+,尚可,三组成功率均差在0.2%,已经十分接近目标;

样本三中数据规模每组在1w+,尚可,四组成功率均差在0.0025%,可以验证并发场景下,实例强锁成功率均等;

Q&A

1、任务执行时长未知,如何保证任务期间,持续占有锁/?

任务占有锁,会启子协程频次监听锁TTL,在可控粒度下,持续保障锁的Expire延长更新。

2、主任务结束,如何终止ReExpire子协程终止/?

关联Goland中协程通信,项目实现中采用Channel/Close()方案实现。

Of crouse,ctx context/Done方案也可行。

3、当并发场景下,会不会出现任务A占有锁的同时,Expire时间到期,锁被任务B占用/?

较低的概率会出现这种问题。

当默认Expire时间内ReExpire策略无数次失败,才会导致锁到期自动释放,被其他任务占用。

4、如何解决1中,任务A假锁,任务B真锁,A执行结束又将Key删除,破坏任务B的问题/?

在Unlock()实现中,做del操作之前会进行Value的校验,匹配时进行del操作,且通过Lua脚本保证原子性。

5、ReExpire逻辑在短类型场景中,是否没必要存在/?

ReExpire逻辑是为兼容长类型场景设计,在短类型场景中不影响业务逻辑正常进行。

附:

GitHub:https://github.com/weiyanyanyan/redisgo_task

产品设计思路借鉴

Consul分布式中Luck()/Unluck()实现原理

Redis大型网站高并发场景下分布式锁实现原理

重试设计之二进制指数退避算法

相关文章:

【腾讯云 Cloud Studio 实战训练营】Redisgo_task 分布式锁实现

文章目录 前言问题场景腾讯云 Cloud Studio Redisgo_task长短类型分布式场景介绍Redisgo_task实现原理SetNx(valueexpire)原子性子协程Done()时间点子协程中的Ticker Redisgo_task唯一外部依赖Redisgo_task Lock结构Redisgo_task架构健壮性设计Redisgo_task可扩展性Redisgo_tas…...

Linux CentOS系统怎么下载软件

Linux CenOS系统想要下载软件可以在Linux内置的应用商店&#xff0c;并通过Yum 包管理器来下载&#xff08;直接使用yum命令下载软件&#xff09; 在Linux系统中&#xff0c;Yum&#xff08;Yellowdog Updater, Modified&#xff09;是用于管理RPM软件包的一个包管理器。 安装…...

SNAT和DNAT原理与应用

iptables的备份和还原 1.写在命令行当中的都是临时配置。 2.把我们的规则配置在 备份&#xff08;导出&#xff09;&#xff1a;iptables-save > /opt/iptables.bak 默认配置文件&#xff1a;/etc/sysconfig/iptables 永久配置&#xff1a;cat /opt/iptables.bak > /etc…...

Java8实战-总结11

Java8实战-总结11 Lambda表达式方法引用管中窥豹如何构建方法引用 构造函数引用 Lambda表达式 方法引用 方法引用让你可以重复使用现有的方法定义&#xff0c;并像Lambda一样传递它们。在一些情况下&#xff0c;比起使用Lambda表达式&#xff0c;它们似乎更易读&#xff0c;感…...

2023爱分析·低代码厂商全景报告|爱分析报告

关键发现 低代码开始向甲方核心场景渗透&#xff0c;呈现两个显著特征&#xff1a;“更深入”、“更垂直”。更深入&#xff0c;即甲方愈发注重低代码在复杂业务场景的应用开发能力&#xff1b;更垂直&#xff0c;即甲方需要使用低代码开发行业垂直应用&#xff0c;因此对行业或…...

视频两侧有黑边怎么处理?教你裁切视频黑边方法

现在的大多数电视是16:9的宽屏&#xff0c;而大多数视频都是4:3的标清或是16:9的高清。当你看一个标清或高清视频时&#xff0c;如果它的比例与你的电视屏幕比例不同&#xff0c;视频两侧就会出现黑边。这些黑边会对视频的质量或观看体验产生影响&#xff0c;那么怎么处理呢&am…...

如何设计一个Android端高性能日志监控系统

开发中客户端经常遇到一些线上问题, 无法复现, 但是又的的确确存在; 当线上反馈的时候无从下手; 主要是因为并不知道用户所处的环境,以及所做的操作顺序或者程序运行的顺序; 在排查问题和复现问题上占用了很大的成本; 如果debug时的log日志如果线上也能查看就好了; 基于此, 我们…...

maven下载按照及初次使用相关配置

maven下载按照及初次使用相关配置 一、下载 与安装 依赖Java&#xff0c;需要配置JAVA_HOME设置MAVEN自身的运行环境&#xff0c;需要配置MAVEN_HOME测试环境配置结果 MVN测试成功&#xff01;&#xff01;&#xff01; 二、本地仓库配置 Maven启动后&#xff0c;会自动保…...

opencv05-掩膜

参考&#xff1a; https://blog.csdn.net/shuiyixin/article/details/88825549 #include <iostream> #include <opencv2/highgui/highgui.hpp> #include <opencv2/opencv.hpp> #include <vector> #include <array> #include <algorithm>u…...

通讯软件013——分分钟学会Kepware OPC AE Server仿真配置

本文介绍如何使用Kepware软件仿真OPC AE Server配置。相关软件可登录网信智汇&#xff08;wangxinzhihui&#xff09;下载。 1、创建1个数据源&#xff1a;本案例采用“Graybox.Simulator.1”作为数据源。连接OPC Server数据源“Graybox.Simulator.1”。 右键点击“连通性”&am…...

Windows下安装Hive(包安装成功)

Windows下安装Hive Hive与Hadoop的版本选择很关键&#xff0c;千万不能选错&#xff0c;否则各种报错。一、Hive下载1.1、官网下载Hive1.2、网盘下载Hive 二、解压安装包&#xff0c;配置Hive环境变量2.1、环境变量新增&#xff1a;HIVE_HOME2.2、修改Path环境变量&#xff0c;…...

count(列名) ,count(1)与count(*) 有何区别?

Mysql版本&#xff1a;8.0.26 可视化客户端&#xff1a;sql yog 文章目录 一、Mysql之count函数简介二、count(列名) &#xff0c;count(常量)与count(*) 有何区别&#xff1f;2.1 统计字段上的区别2.2 执行效率上的区别 一、Mysql之count函数简介 &#x1f449;表达式 COUNT(…...

node.js判断元素是否包括

在Node.js中&#xff0c;可以使用Array.prototype.some()方法来判断数组中是否包含某个元素。下面是一个示例代码&#xff1a; const arr [ { ‘_android:name’: ‘com.eg.android.AlipayGphone’ }, { ‘_android:name’: ‘com.eg.android.AlipayGphoneRC’ }, { ‘_andro…...

基于SpringBoot+Vue的地方废物回收机构管理系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…...

【SAP MII学习】Day01--Overview, Security Services, and Workbench

1. Module 1: Overview 1.1 问题存在的原因 上图展示的是在工厂中IT的架构图&#xff0c;主要分为一下的三个层次&#xff1a; Shop Floor Automation and Control Systems (SFAC):collect data from the PLCs and sensors that are connected to the machinery on the facto…...

枚举类常见用法,A Guide to Java Enums

目录 啥是枚举类Custom Enum MethodsComparing Enum Types Using “” OperatorUsing Enum Types in Switch StatementsFields, Methods and Constructors in EnumsEnumSetEnumMapStrategy PatternSingleton PatternJava 8 and EnumsJSON Representation of EnumRead More Java…...

Vue Baidu Map--vue引入百度地图

1.安装 npm方式安装 $ npm install vue-baidu-map --save2.局部注册 <template> <div class"map-content" v-if"iscollegeRole"><baidu-map class"bm-view map":ak"mapAK" :scroll-wheel-zoom"true" :cen…...

使用Express部署Vue项目

使用Express部署Vue项目 目录 1. 背景 2. 配置Vue CLI 1.1 安装nodejs 1.2 创建vue-cli 1.3 创建vue项目 1.4 构建vue项目3. 配置Express 2.1 安装express 2.2 创建项目4. 使用express部署vue项目 1&#xff0c;背景 我们想要做一个前后端分离的课程项目&#xff0c;前端…...

344.翻转字符串+387.字符串中的第一个唯一字符

目录 一、翻转字符串 二、字符串中的第一个唯一字符 一、翻转字符串 344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:void reverseString(vector<char>& s) {int start0;int end s.size()-1;while(start < end){swap(s[sta…...

安装mmcv

安装MMCV 创建虚拟环境gupao ,并激活nvcc -V 查看cuda版本 打开当前项目文件主页查看环境配置Prerequisites — MMPretrain 1.0.1 documentation 4. 安装合适的torch版本&#xff0c;原来的版本会自动卸载 pip install torch1.13.1cu117 torchvision0.14.1cu117 torch…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...