- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第
第 PAGE 3 页
【C#|.NET】分布式锁服务
2012-01-16 17:58 by 熬夜的虫子, 1695 阅读, 1 评论, 收藏, 编辑
背景
分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那一层来挡。当大量的行锁、 表锁、事务充斥着数据库的时候,不如换个角度思考问题。一般web 应用很多的瓶颈都在数据库上,这里给大家介绍的是减轻数据库锁负担的一种方案。
简介
如果我们的需求很简单,例如对于用户的账户资金,要保证原子性操作。并且不同的客户端在同一时间内 只能提交一个对象操作。lock、单例?!在单台上还可以,但是大型web 项目上,负载均衡是常用的技术手段手段,同一意义的对象可能存在不同的副本,这时我们又如何保证排他操作。数据库的事务!除了这个,接下 来我们引出本章的主题、分布式锁服务。
一个简单的锁服务实现起来并不难,甚至利用 memcache 很快就能构造一套分布式锁系统。我们只需要在操作对象时写入kv 键值对,操作完毕时释放 kv,在读取对象时判断 kv 中是否有数据就可以了,我们甚至还可以给它一个默认的释放时间。
这是一种解决方案,但是如果我们的要求更高一点,我们需要权限认证(例如只能来自xxx 域名的请求)、需要上下级节点关联(例如一个用户的资金账户被锁住,同时锁住他的购物车、积分等)、需要监视器回调、 甚至需要考虑单点故障问题。那么,虫子在这里推荐另一套方案 zookeeper。
zookeeper
官方文档: /doc/r3.3.2/zookeeperOver.html#ch_DesignOverview 下载: /releases.html
Zookeeper 是 Hadoop 中的一个模块。是一个分布式的,开源的分布式应用程序协调服务,用它可以来现同步服务,配置维护。
更多的内容大家看文档吧或者直接网上搜一下,理论性的内容写多了让人困。我们直接看实践。
性能篇
服务器ubuntu (虚拟机一台) 客户端window2003
服务端安装好java 环境 然后跟着官方的介绍部署
启动 zkserver
我们测试下锁服务相关的操作
ps:试下本机的windows2003 因为是本地环境 不于上面做对比 仅看看zookeeper 本身的数据处理效率
功能篇
一张图就可以介绍完普通功能
再看下watcher
public class MyWatch : IWatcher
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(29:2181, new TimeSpan(0, 0, 0, 4000), new MyWatch());
检查是否存在时zk.Exists(Dir, new MyWatch2());
获取数据时zk.GetData(Dir, new MyWatch2(), stat);
我们再运行一遍之前的demo 去掉delete 操作
加上 delete 操作
浅析
创建连接:
获取服务主机列表
设置超时时间
注册客户端事件
以线程安全的方式创建请求连接(启动客户端请求队列,循环队列基于 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, Crea
您可能关注的文档
最近下载
- 2025年重庆市中考英语试题(A卷)(含听力音频和答案).pdf VIP
- 低温冰雪天气安全教育.pptx VIP
- 医疗机构睡眠门诊建设和管理专家共识2025版.docx VIP
- 《小狗钱钱》读书笔记.docx VIP
- 2024事业单位招聘药剂岗位考试题.pdf
- STA无痛麻醉仪课件-sta无痛麻醉仪课件.ppt VIP
- Eurotherm欧陆 Mini8 Firmware v5.0+用户指南.pdf VIP
- 《水运工程建设期碳排放计算标准》.pdf
- 小学音乐教学中小乐器进课堂的实践与研究.docx VIP
- 云南省昆明市官渡区2023_2024学年五年级上学期语文期末学业质量监测试卷.doc VIP
原创力文档


文档评论(0)