前言

在分布式系统中,多个线程、进程或服务之间常常需要并发访问共享资源,这就带来了数据同步与一致性的挑战。今天大姚给大家分享一个.NET应用中的高效分布式同步解决方案:DistributedLock。

项目介绍

DistributedLock 是一个 .NET 开源的库,它基于多种底层技术提供了强大且易于使用的分布式互斥锁、读写锁和信号量。确保多个线程、进程或服务能够安全、协调地访问共享资源,防止竞态条件,维护数据一致性。

多种技术的实现方案

DistributedLock 提供了基于多种技术的实现方案,你可以单独安装所需的实现包,也可以直接安装 DistributedLock NuGet 包使用。

项目源代码

DistributedLock 包安装

在 NuGet 包管理器中搜索:DistributedLock 安装。

在 ASP.NET Core 应用中使用

对于使用依赖注入的应用程序,DistributedLock 的提供程序可以轻松地将锁(或其他原语)名称的规范与其其他设置(如数据库连接字符串)分离开来。例如,在一个 ASP.NET Core 应用程序中,你可以这样做:

Program.cs 中注册

        var builder = WebApplication.CreateBuilder(args);

        // Add services to the container.
        builder.Services.AddRazorPages();

        // 注册一个单例的 IDistributedLockProvider,使用 Postgres 作为底层实现
        builder.Services.AddSingleton<IDistributedLockProvider>(_ => new PostgresDistributedSynchronizationProvider(myConnectionString));
        builder.Services.AddTransient<UserAccountService>();

对账户进行同步的初始化操作

    public class UserAccountService
    {
        private readonly IDistributedLockProvider _synchronizationProvider;

        /// <summary>
        /// 构造函数,接受 IDistributedLockProvider 的注入
        /// </summary>
        /// <param name="synchronizationProvider">synchronizationProvider</param>
        public UserAccountService(IDistributedLockProvider synchronizationProvider)
        {
            this._synchronizationProvider = synchronizationProvider; // 将注入的 IDistributedLockProvider 赋值给私有字段
        }

        public void InitializeUserAccount(int id)
        {
            // 使用提供者来构造一个锁
            var currentLock = this._synchronizationProvider.CreateLock($"UserAccount{id}"); // 根据用户账户ID创建一个锁
            using (currentLock.Acquire()) // 获取锁,并在 using 块结束时自动释放
            {
                // 执行操作(在锁保护下)
            }

            // 或者,对于常见用例,扩展方法允许通过单个调用来完成此操作
            using (this._synchronizationProvider.AcquireLock($"UserAccount{id}")) // 直接使用提供者的扩展方法来获取并释放锁
            {
                // 执行操作(在锁保护下)
            }
        }
    }

基于 Redis 实现的分布式锁

DistributedLock.Redis 包提供了基于 Redis 实现的分布式锁功能,如下所示:

  • 实现说明:https://redis.io/docs/latest/develop/use/patterns/distributed-locks
            var connectionString = "redis链接";
            var connection = await ConnectionMultiplexer.ConnectAsync(connectionString); // uses StackExchange.Redis
            var currentLock = new RedisDistributedLock("MyLockName", connection.GetDatabase());
            await using (var handle = await currentLock.TryAcquireAsync())
            {
                if (handle != null)
                {
                    //我已经获取了锁
                }
            }

基于 ZooKeeper 实现的分布式锁

DistributedLock.ZooKeeper 包提供过了基于 Apache ZooKeeper 提供的分布式锁功能,如下所示:

  • 实现说明:https://zookeeper.apache.org/doc/r3.1.2/recipes.html
            var currentLock = new ZooKeeperDistributedLock("MyLockName", connectionString);
            await using (await currentLock.AcquireAsync())
            {
                // 我已经获取了锁
            }

项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看,别忘了给项目一个Star支持。

优秀项目和框架精选

该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没)。

.NET应用中的高效分布式同步解决方案的更多相关文章

  1. 集群中几种session同步解决方案的比较[转]

    集群中session安全和同步是个最大的问题,下面是我收集到的几种session同步的方案,希望能通过分析其各自的优劣找出其适应的场景. 1. 客户端cookie加密 这是我以前采用的方式,简单,高效 ...

  2. 集群中几种session同步解决方案的比较

    1. 客户端cookie加密 .比较好的方法是自己采用cookie机制来实现一个session,在应用中使用此session实现. 问题:session中数据不能太多,最好只有个用户id. Sessi ...

  3. Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案

    Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案 说明:Java生鲜电商平台中由于采用了微服务架构进行业务的处理,买家,卖家,配送,销售,供应商等进行服务化,但是不可避免存在 ...

  4. SpringCloudAlibaba分布式事务解决方案Seata实战与源码分析-中

    事务模式 概述 在当前的技术发展阶段,不存一个分布式事务处理机制可以完美满足所有场景的需求.一致性.可靠性.易用性.性能等诸多方面的系统设计约束,需要用不同的事务处理机制去满足. 目前使用的流行度情况 ...

  5. j2ee中spring的分布式事务实现及解决方案

    1 java事务类型 Java事务的类型有三种:JDBC事务.JTA(Java Transaction API)事务.容器事务. 常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供 ...

  6. 阿里开源分布式事务解决方案 Fescar

    微服务倡导将复杂的单体应用拆分为若干个功能简单.松耦合的服务,这样可以降低开发难度.增强扩展性.便于敏捷开发.当前被越来越多的开发者推崇,系统微服务化后,一个看似简单的功能,内部可能需要调用多个服务并 ...

  7. 分布式事务解决方案FESCAR

    项目地址:FESCAR 以下是官网的文档.简介2019年,Fescar 是 阿里巴巴 开源的 分布式事务中间件,以 高效 并且对业务 0 侵入 的方式,解决 微服务 场景下面临的分布式事务问题. 1. ...

  8. 来了!阿里开源分布式事务解决方案 Fescar

    摘要: 阿里妹导读:广为人知的阿里分布式事务解决方案:GTS(Global Transaction Service),已正式推出开源版本,取名为“Fescar”,希望帮助业界解决微服务架构下的分布式事 ...

  9. 【G】开源的分布式部署解决方案文档 - 使用手册

    G.系列导航 [G]开源的分布式部署解决方案 - 导航 已知问题 导航没有联动 因为权限只是做了基础的登录校验,考虑到后面导航要跟权限关联上暂时是写死的. 只有部分界面使用了Vue.js 因为刚开始没 ...

  10. 阿里微服务架构下分布式事务解决方案-GTS

    虽然微服务现在如火如荼,但对其实践其实仍处于初级阶段.即使互联网巨头的实践也大多是试验层面,鲜有核心业务系统微服务化的案例.GTS是目前业界第一款,也是唯一的一款通用的解决微服务分布式事务问题的中间件 ...

随机推荐

  1. QwQ-32B:用强化学习打造的AI推理黑科技 🚀

    现在就体验 QwQ-32B:https://qwq32.com AI界的新星闪耀登场 小伙伴们,AI领域又出现重大突破啦!Qwen团队最新发布的QwQ-32B模型简直太厉害了!这个只有320亿参数的模 ...

  2. 在类 Unix 系统中将 Nginx 源码导入 CLion 并调试运行

    零.写在最前面 0.1 关于系统 如标题所述,本文的操作需要一个类 Unix 系统(MacOS.CentOS.Ubuntu 等). 同时这些类 Unix 系统还需要有 gcc 编译器.具体如何搞定这些 ...

  3. 使用Python解决Logistic方程

    引言 在数学和计算机科学中,Logistic 方程是描述人口增长.传播过程等现象的一种常见模型.它通常用于表示一种有限资源下的增长过程,比如动物种群.疾病传播等.本文将带领大家通过 Python 实现 ...

  4. 使用Python计算万有引力势能

    引言 在物理学中,万有引力是描述物体之间相互吸引的基本力之一.牛顿的万有引力定律告诉我们,任何两个物体之间都存在引力,这个引力与它们的质量和它们之间的距离有关.在这个定律中,万有引力势能是一个非常重要 ...

  5. 🎀idea获取当前项目git仓库地址

    简介 在idea中快速获取当前项目的远程仓库地址 方案一 右键项目 选择Git 选择Manage Remotes 弹框中的URL就是远程仓库地址 方案二 打开terminal 命令行 直接Git命令查 ...

  6. mybatis-plus之配置安全

    1. 环境 SpringBoot 2.6.x 2. 介绍 MyBatis-Plus 从3.3.2版本开始提供了数据安全保护功能,MyBatis-Plus 支持通过加密配置来增强数据库的安全性. 3. ...

  7. Linux Nginx tomcat集群--打程序补丁步骤

    Linux Nginx Tomcat集群--打程序补丁步骤 一.若不知道服务器中nginx所在目录(知道目录位置,从第3条开始看) 1.查找nginx进程(默认80端口) netstat -lntup ...

  8. 快速开始 Mybatis TypeHandler

    theme: orange MyBatis TypeHandler是MyBatis框架中的举足轻重的组件之一,用于处理Java对象和数据库中的数据类型之间的转换. MyBatis TypeHandle ...

  9. html input 是否允许浏览器字段默认值 或者之前输入的值

    autocomplete 属性是 HTML5 中的新属性,在input中autocomplete属性是默认开启的. 1.定义:autocomplete属性规范表单是否启用自动完成功能.自动完成允许浏览 ...

  10. Android frida hook (学习分享)

    frida模块 参考: https://www.52pojie.cn/thread-1823118-1-1.html https://www.52pojie.cn/thread-1840174-1-1 ...