千家信息网

如何理解C#.NET分布式锁服务

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇文章给大家分享的是有关如何理解C#.NET分布式锁服务,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。背 景分布式锁服务在大家的项目中
千家信息网最后更新 2026年11月01日如何理解C#.NET分布式锁服务

本篇文章给大家分享的是有关如何理解C#.NET分布式锁服务,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

背 景

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

简 介

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

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

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

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 MyWatch3 : IWatcher      {          public void Process(WatchedEvent qevent)          {              Console.WriteLine("this is MyWatch3");          }         }

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

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

获取数据时zk.GetData(Dir, new MyWatch3(), 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 MyWatch3());

获取数据 getData

demo :zk.GetData(Dir, new MyWatch3(), 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。

以上就是如何理解C#.NET分布式锁服务,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

节点 数据 服务 分布式 对象 数据库 内容 客户 客户端 不同 方案 方法 时间 更多 顺序 事务 先后 功能 同时 名字 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云南咖啡 互联网科技公司 西安纸贵互联网科技有限公司 美国互联网保险保险科技 科技类互联网 互联网科技作文 时间互联网络科技 互联网科技股午盘股票涨跌 天速互联网络科技有限公司 互联网科技热点资讯 科技与互联网哪个更好 重庆互联网医院沙龙医盟信息科技 湖北码尼互联网科技有限公司电话 速维有品互联网信息科技(苏州)有限公司 互联网方面的科技前沿 张召忠谈中国互联网科技 从那以后互联网科技有限公司 半导体行业属于互联网高科技类吗 宁波跨境商互联网科技有限公司 互联网领先科技成果宣传视频 南京欣网互联网络科技 深圳市人人互联网科技有限公司 国智互联网科技 科技互联网公司装修 万易互联网科技有限公司 恒生科技互联网指数分析 宜昌元轩互联网科技有限公司 国大互联网教育科技有限公司工作 互联网第三次科技革命特征 平安好医生打造互联网科技医疗
0