【C#|.NET】分布式锁服务

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介:

背景

  分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那一层来挡。当大量的行锁、表锁、事务充斥着数据库的时候,不如换个角度思考问题。一般web应用很多的瓶颈都在数据库上,这里给大家介绍的是减轻数据库锁负担的一种方案。


简介

  如果我们的需求很简单,例如对于用户的账户资金,要保证原子性操作。并且不同的客户端在同一时间内只能提交一个对象操作。lock、单例?!在单台上还可以,但是大型web项目上,负载均衡是常用的技术手段手段,同一意义的对象可能存在不同的副本,这时我们又如何保证排他操作。数据库的事务!除了这个,接下来我们引出本章的主题、分布式锁服务。  

  一个简单的锁服务实现起来并不难,甚至利用memcache很快就能构造一套分布式锁系统。我们只需要在操作对象时写入kv键值对,操作完毕时释放kv,在读取对象时判断kv中是否有数据就可以了,我们甚至还可以给它一个默认的释放时间。

  这是一种解决方案,但是如果我们的要求更高一点,我们需要权限认证(例如只能来自xxx域名的请求)、需要上下级节点关联(例如一个用户的资金账户被锁住,同时锁住他的购物车、积分等)、需要监视器回调、甚至需要考虑单点故障问题。那么,虫子在这里推荐另一套方案----zookeeper。


zookeeper

  官方文档:http://zookeeper.apache.org/doc/r3.3.2/zookeeperOver.html#ch_DesignOverview

  下载:http://zookeeper.apache.org/releases.html

  Zookeeper是Hadoop中的一个模块。是一个分布式的,开源的分布式应用程序协调服务,用它可以来现同步服务,配置维护。

  更多的内容大家看文档吧或者直接网上搜一下,理论性的内容写多了让人困。我们直接看实践。


性能篇

  服务器ubuntu (虚拟机一台)

  客户端window2003

  服务端安装好java环境 然后跟着官方的介绍部署

  

  启动zkserver

  我们测试下锁服务相关的操作

  

  ps:试下本机的windows2003  因为是本地环境 不于上面做对比 仅看看zookeeper本身的数据处理效率

  

  


功能篇

  一张图就可以介绍完普通功能

  

  再看下watcher  

?
public  class  MyWatch : IWatcher
     {
         public  void  Process(WatchedEvent qevent)
         {
             Console.WriteLine( "this is MyWatch" );
         }    
     }
public  class  MyWatch2 : IWatcher
     {
         public  void  Process(WatchedEvent qevent)
         {
             Console.WriteLine( "this is MyWatch2" );
         }  
     }

 创建连接时 new ZooKeeper("192.168.206.129:2181", new TimeSpan(0, 0, 0, 4000), new MyWatch());

检查是否存在时zk.Exists(Dir, new MyWatch2());

获取数据时zk.GetData(Dir, new MyWatch2(), stat);

我们再运行一遍之前的demo  去掉delete操作

加上delete操作


 浅析

  创建连接:

  1.获取服务主机列表

  2.设置超时时间

  3.注册客户端事件

  4.以线程安全的方式创建请求连接(启动客户端请求队列,循环队列基于socket通信、根据请求类型执行不同的请求动作)

  请求流程:

  构造请求头、构造request,reponse、构造响应头、构造Packet对象,packet对象准备好后,把整个对象放入一个outgoingQueue 
packet被放入outgoingQueue中,等待SendThread把packet对应的内容发送给server。server处理分3步在doio方法中ReadLength ReadConnectResult ReadResponse,直到ReadResponse方法中确定packet请求结束。

  响应流程:

  针对心跳的ping请求的resp,针对auth请求的resp,一般接口请求的resp,如果接口请求要求了watcher,当watcher关注的内容有变化时的notification

  锁相关部分API方法:

  创建节点:create

  demo:zk.Create(Dir, severname.GetBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.Persistent);

  其中CreateMode分为4类Persistent、PersistentSequential、Ephemeral、EphemeralSequential

  PERSISTENT 创建持久化节点,对应机器关闭连接后节点/数据不会消失

  PERSISTENT_SEQUENTIAL 如果PATH是以’/’结尾则以这个PATH作为父节点,创建一个子节点,其子节点名字是一个按先后顺序排列的数值;否则创建一个名字是‘/’后面字符加上先后顺序排列的数值字符串的节点,同样创建持久节点

  EPHEMERAL 创建瞬时节点,Zookeeper在感知连接机器宕机后会清除它创建的瞬时节点

  EPHEMERAL_SEQUENTIAL 穿件瞬时顺序节点,和PERSISTENT_SEQUENTIAL一样,区别在于它是瞬时的

  删除节点 delete

  demo :zk.Delete(Dir, -1);

  前一个参数代表节点名称(一般用作路径),后一个是版本号 -1表示全匹配

  查看节点 exists

  demo : zk.Exists(Dir, new MyWatch2());

  获取数据 getData 

  demo :zk.GetData(Dir, new MyWatch2(), stat);

  获取一个节点的数据,可注入watcher   

  设置数据 setData 

  demo : zk.SetData(Dir, new byte[1], 1);

  获取下级节点集合 GetChildren

  demo :zk.GetChildren(Dir, true);

  存储

  znodes类似文件和目录。但它不是一个典型的文件系统,zookeeper数据保存在内存中,这意味着zookeeper可以实现高吞吐量和低延迟。

  watcher

  Zookeeper有两种watches,一种是data watches,另一种是child watches。其中,getData()和exists()以及create()等会添加data watches,getChildren()会添加child watches。而delete()涉及到删除数据和子节点,会同时触发data watches和child watches。

     详细可以参考:http://www.geminikwok.com/2011/09/08/%E6%B5%85%E8%B0%88zookeeper-watch%E4%BA%8B%E4%BB%B6/

  算法

  Paoxs算法 本篇中仅用单台server做demo 改个时间详细介绍下Paoxs  


 本篇先到此 希望对大家有帮助

 

 


本文转自 熬夜的虫子  51CTO博客,原文链接:http://blog.51cto.com/dubing/791464


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
25天前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
59 3
|
15天前
|
消息中间件 网络协议 C#
C#使用Socket实现分布式事件总线,不依赖第三方MQ
`CodeWF.EventBus.Socket` 是一个轻量级的、基于Socket的分布式事件总线系统,旨在简化分布式架构中的事件通信。它允许进程之间通过发布/订阅模式进行通信,无需依赖外部消息队列服务。
C#使用Socket实现分布式事件总线,不依赖第三方MQ
|
17天前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
16 1
|
20天前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
29 1
|
26天前
|
人工智能 开发框架 C#
C#/.NET/.NET Core技术前沿周刊 | 第 6 期(2024年9.16-9.22)
C#/.NET/.NET Core技术前沿周刊 | 第 6 期(2024年9.16-9.22)
|
26天前
|
人工智能 开发框架 Cloud Native
C#/.NET/.NET Core技术前沿周刊 | 第 9 期(2024年10.07-10.13)
C#/.NET/.NET Core技术前沿周刊 | 第 9 期(2024年10.07-10.13)
|
26天前
|
开发框架 前端开发 API
C#/.NET/.NET Core优秀项目和框架2024年9月简报
C#/.NET/.NET Core优秀项目和框架2024年9月简报
|
26天前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
26天前
|
数据可视化 NoSQL C#
C#/.NET/.NET Core技术前沿周刊 | 第 8 期(2024年10.01-10.06)
C#/.NET/.NET Core技术前沿周刊 | 第 8 期(2024年10.01-10.06)
|
26天前
|
开发框架 缓存 算法
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)