文档章节

[Curator] Shared Semaphore 的使用与分析

秋雨霏霏
 秋雨霏霏
发布于 2017/06/01 17:03
字数 518
阅读 41
收藏 0

Shared Semaphore

一个计数信号量,可以使用一把锁来限制进程进入的数量(租约)。每一个用户按请求顺序得到一份租约,基本上还是一个公平的过程。

有两种方式来控制信号量的最大租约数(max leases)。

  1. 用户直接设定某个path下最大租约数
    • 不可以对不同的处理任务进行单独限制数量
    • 所有的任务都使用一个公用的限制数
  2. 使用一个SharedCountReader来决定对于path下应该提供多少份租约
    • 可以为不同的执行任务分配不同的租约数量

对于获得到的租约,一定要妥善的关闭(例如,在finally块中调用close方法),否则,租约就会丢失(信号量可用数量不可逆的减少了)。

在客户端session失效时,链接持有的租约会自动关闭,其他客户端可以继续使用这份租约。

1. 关键 API

org.apache.curator.framework.recipes.locks.InterProcessSemaphoreV2

org.apache.curator.framework.recipes.locks.Lease

org.apache.curator.framework.recipes.shared.SharedCountReader

2. 机制说明

《Shared Lock 的使用与分析》中已经见识过InterProcessSemaphoreV2的使用了。

3. 用法

3.1 创建

3.1.1 直接设定maxLeases的方式

public InterProcessSemaphoreV2(CuratorFramework client,
                             String path,
                             int numberOfLeases)

3.1.2 使用SharedCountReader的方式

public InterProcessSemaphoreV2(CuratorFramework client,
                             String path,
                             SharedCountReader count)

3.2 使用

3.2.1 申请

提供了好几个acquire方法,可用于不同的场景:

  1. 阻塞式申请单个
public Lease acquire()
  1. 阻塞式批量申请
public Collection<Lease> acquire(int qty)
  1. 等待式申请单个
public Lease acquire(long time,
                     TimeUnit unit)
  1. 等待式批量申请
public Collection<Lease> acquire(int qty,
                               long time,
                               TimeUnit unit)

3.2.2 归还

  1. 批量归还
public void returnAll(Collection<Lease> leases)
  1. 单个归还
public void returnLease(Lease lease)

当然,也可以直接调用租约的关闭方法:Lease#close()

4. 错误处理

实际使用中,必须考虑链接问题。 强烈建议:添加一个ConnectionStateListener用以处理链接中断或者丢失的情况

5. 源码分析

参见《Shared Lock 的使用与分析》中,有关InterProcessSemaphoreV2的部分。

© 著作权归作者所有

共有 人打赏支持
秋雨霏霏
粉丝 149
博文 91
码字总数 160620
作品 0
杭州
CTO(技术副总裁)
跟着实例学习ZooKeeper的用法: Curator扩展库

还记得Curator提供哪几个组件吗? 我们不妨回顾一下: Recipes Framework Utilities Client Errors Extensions 前面的例子其实前五个组件都涉及到了, 比如Utilities例子的TestServer, Clien...

longbadx
2015/02/11
0
0
分布式利器Zookeeper(三)

前言 《分布式利器Zookeeper(一)》 《分布式利器Zookeeper(二):分布式锁》 本篇博客是分布式利器Zookeeper系列的最后一篇,涉及的话题是:Zookeeper分布式锁的代码实现、zkclient的使用、...

zfz_linux_boy
07/01
0
0
Apache Curator 2.7.1 发布

Apache Curator 2.7.1 发布了,zookeeper 的客户端调用过于复杂,Curator提供了对zookeeper客户端的封装,Apache Curator 就是为了简化zookeeper客户端调用而生,利用它,可以更好的使用zoo...

凯文加内特
2015/03/02
0
0
ZooKeeper学习笔记六 ZooKeeper开源客户端Curator

本文学习资源来自《从Paxos到ZooKeeper分布式一致性原理与实践》 Curator Curator是Netflix公司开源的一套ZooKeeper客户端框架,作者是Jordan Zimmerman。 和ZkClient一样,Curator解决了很多...

xundh
04/28
0
0
使用Zookeeper解决微服务架构下分布式事务问题

准备工作 单机调试zookeeper集群的话,我们需要在虚拟机里虚拟出几台“微服务器“,做这一步操作之前需要在系统中预留出来8G以上磁盘空间,4G以上物理内存。 [if !supportLists]1. [endif]虚...

A尚学堂Nancy老师
09/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

想用Unity3D引擎软件赚点钱的看过来

前言: 你可以不拥有很多钱 但你一定要有赚钱的能力 目前手上有项目, 需要熟练Unity3D引擎软件的伙伴 有意向的给我发私信

猿神出窍
29分钟前
0
0
Spring Boot全局异常处理

Spring Boot默认的异常处理机制 默认情况下,Spring Boot为两种情况提供了不同的响应方式。 一种是浏览器客户端请求一个不存在的页面或服务端处理发生异常时,一般情况下浏览器默认发送的请求...

狼王黄师傅
56分钟前
7
0
Thinkphp5 优雅配置两个数据库

工作需要需要配置两个数据库,框架5.0的,步骤如下: 1、在database.php同级创建一个database2.php文件 在里面配置第二个数据库信息, 2、在config中配置这个数据库信息: 3、创建第二个表的...

wqzbxh
今天
4
0
Socket网络编程进阶与实战

Socket网络编程进阶与实战 Socket对于每个工程师的重要性不言而喻。本课程将理论结合实践,带你从零开始,系统学习Socket编程技术,让Socket的学习不再那么零散与难以掌握,同时会提炼出Soc...

qq__2304636824
今天
4
0
Android studio常用快捷键

Ctrl +Alt +Space //显示可用参数 Ctrl + Alt +M //抽取方法 Ctrl +Alt + F //提取全局变量 Ctrl +Shift + "+或-" //折叠/展开代码块 Shift + F6 //批量更改变量 Ctrl + Tab //切换器 Ctrl +...

lanyu96
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部