分布式锁服务

上传人:新** 文档编号:489333375 上传时间:2023-01-17 格式:DOCX 页数:5 大小:198.87KB
返回 下载 相关 举报
分布式锁服务_第1页
第1页 / 共5页
分布式锁服务_第2页
第2页 / 共5页
分布式锁服务_第3页
第3页 / 共5页
分布式锁服务_第4页
第4页 / 共5页
分布式锁服务_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《分布式锁服务》由会员分享,可在线阅读,更多相关《分布式锁服务(5页珍藏版)》请在金锄头文库上搜索。

1、【C#I.NET】分布式锁服务2012-01-16 17:58 by熬夜的虫子,1695阅读,1评论,收藏,编辑背景分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那一层来挡。当大量的行锁、 表锁、事务充斥着数据库的时候,不如换个角度思考问题。一般web应用很多的瓶颈都在数据库上,这里给大 家介绍的是减轻数据库锁负担的一种方案。简介如果我们的需求很简单,例如对于用户的账户资金,要保证原子性操作。并且不同的客户端在同一时间内 只能提交一个对象操作。lock、单例?!在单台上还可以,但是大型web项目上,负载均衡是常用的技术手段 手段,同一意义的对象可能存在不同的副本,这时我们又

2、如何保证排他操作。数据库的事务!除了这个,接下 来我们引出本章的主题、分布式锁服务。一个简单的锁服务实现起来并不难,甚至利用memcache很快就能构造一套分布式锁系统。我们只需要在操 作对象时写入kv键值对,操作完毕时释放kv,在读取对象时判断kv中是否有数据就可以了,我们甚至还可以 给它一个默认的释放时间。这是一种解决方案,但是如果我们的要求更高一点,我们需要权限认证(例如只能来ixxx域名的请求)、 需要上下级节点关联(例如一个用户的资金账户被锁住,同时锁住他的购物车、积分等)、需要监视器回调、 甚至需要考虑单点故障问题。那么,虫子在这里推荐另一套方案 zookeeper。zookeep

3、er官方文档:http:/zookeeper.apache.org/doc/r3.3.2/zookeeperOver.html#ch_DesignOverview下载:http:/zookeeper.apache.org/releases.htmlZookeeper是Hadoop中的一个模块。是一个分布式的,开源的分布式应用程序协调服务,用它可以来现同 步服务,配置维护。更多的内容大家看文档吧或者直接网上搜一下,理论性的内容写多了让人困。我们直接看实践。性能篇服务器ubuntu (虚拟机一台)客户端 window2003服务端安装好java环境然后跟着官方的介绍部署root(aubuntu:/

4、usr/local/zookeeper-3.4.2/bin# 11total 88 dxr-xr-x 2 drwxr-xr-x 10 -rwxr-xr-x 1 -rwxr-xr-x 1 -rwxr-xr-x I -rv/xr-xr-x 1 -nixr-xr-x I -rwxr-xr-x I -rwxr-xr-x 1 -rwxr-xr-x 1 -rw-r- r- - 1501 Staff 4096501 Staff 4096501 staff 238501 staff 1909501 staff 1049501 staff 1510591 staff 1333501 staff 2599501

5、staff 1984501 staff 5109root root 387752012-01-12 222011-12-21 122011-12-21 122011-12-21 122011-12-21 122011-12-21 122011-12-21 122911-12-21 122911-12-21 122011- 12-21 122012- 01-15 2330 ./53 .47 README-txt*47 zkClean叩.sh*47 zkCli.cmd*47 zkCli.sh*47 zkEnv.cmd*47 zkEnv.sh*47 zkServer.cmd*47 zkServer.

6、sh*05 zookeeper.outrootubuntu:/usr/local/zookeeper-3.4.2/bin# ./zkServer.sh startJMX enabled by defaultUsing config: /usr/local/zookeeper-3.4.2/bin/./conf/zoo.cfg Starting zookeeper . STARTED启动 zkserver我们测试下锁服务相关的操作CreateClientJI : 36m蓉 Exists;了171ms Create | 69ms GetDataJfl i246ms Delete ! 108msps:

7、试下本机的windows2003因为是本地环境不于上面做对比 仅看看zookeeper本身的数据处理效率(Create Client 用了 17msExists/ r78ms Create/ 721ms GetData/fj : 5ms Delete/|j i 18ms功能篇一张图就可以介绍完普通功能再看下watcherpublic class MyWatch : IWatcherpublic void Process(WatchedEvent qevent)Console.WriteLine(this is MyWatch);public class MyWatch2 : IWatcherp

8、ublic 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操作JCreateClientr this is MyWatch Exi

9、sts用 f129ms GetDmtai用.加上delete操作CreateClient Y20ms this is MyWatcli Existsi b2ms GetData i 60ms this is MyWatcli2 this is MyUatci2 Delete/ i 16ms浅析创建连接:1. 获取服务主机列表2. 设置超时时间3. 注册客户端事件4. 以线程安全的方式创建请求连接(启动客户端请求队列,循环队列基于socket通信、根据请求类型执行 不同的请求动作)请求流程:构造请求头、构造request,reponse、构造响应头、构造Packet对象,packet对象准备好后

10、,把整个对象 放入一个outgoingQueue packet被放入outgoingQueue中,等待SendThread把packet对应的内容发送给 server。server 处理分 3 步在 doio 方法中 ReadLength ReadConnectResult ReadResponse,直到 ReadResponse 方法中确定packet请求结束。响应流程:针对心跳的ping请求的resp,针对auth请求的resp,一般接口请求的resp,如果接口请求要求了 watcher, 当watcher关注的内容有变化时的notification锁相关部分API方法:创建节点:crea

11、tedemo: zk.Create(Dir, severname.GetBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.Persistent);其中 CreateMode 分为 4 类 Persistent、PersistentSequential、Ephemeral EphemeralSequentialPERSISTENT创建持久化节点,对应机器关闭连接后节点/数据不会消失PERSISTENT_SEQUENTIAL如果PATH是以/结尾则以这个PATH作为父节点,创建一个子节点,其子节点 名字是一个按先后顺序排列的数值;否则创建一个名字是/后面字符加上先后

12、顺序排列的数值字符串的节 点,同样创建持久节点EPHEMERAL创建瞬时节点,Zookeeper在感知连接机器宕机后会清除它创建的瞬时节点EPHEMERAL_SEQUENTIAL穿件瞬时顺序节点,和PERSISTENT_SEQUENTIAL 一样,区别在于它是瞬时的删除节点deletedemo : zk.Delete(Dir, -1);前一个参数代表节点名称(一般用作路径),后一个是版本号-1表示全匹配查看节点existsdemo : zk.Exists(Dir, new MyWatch2();获取数据getDatademo : zk.GetData(Dir, new MyWatch2(),

13、stat);获取一个节点的数据,可注入watcher设置数据setDatademo : zk.SetData(Dir, new byte1, 1);获取下级节点集合GetChildrendemo : zk.GetChildren(Dir, true);存储znodes类似文件和目录。但它不是一个典型的文件系统,zookeeper数据保存在内存中,这意味着zookeeper 可以实现高吞吐量和低延迟。watcherZookeeper 有两种 watches,一种是 data watches,另一种是 child watches0 其中,getData()和 exists() 以及create()等会添加data watches, getChildren()会添加child watches。而delete()涉及到删除数据和 子节点,会同时触发data watches和child watches。详细可以参考:http:/ 本篇中仅用单台server做demo改个时间详细介绍下Paoxs本篇先到此希望对大家有帮助

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号