文档章节

[Curator] Shared Semaphore 的使用与分析

秋雨霏霏
 秋雨霏霏
发布于 2017/06/01 17:03
字数 518
阅读 40
收藏 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的部分。

© 著作权归作者所有

共有 人打赏支持
秋雨霏霏
粉丝 146
博文 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
Maven构建ZooKeeper项目

执行mvn命令: mvn archetype:create -DgroupId=com.astute.strong -DartifactId=learn_zookeeper -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false 修改pom,添加......

智深
2012/11/24
0
5

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周三乱弹 —— 公司女同事约我

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享水木年华的单曲《蝴蝶花(2002年大提琴版)》 《蝴蝶花(2002年大提琴版)》- 水木年华 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
12分钟前
28
7
Linux环境搭建 | VMware下共享文件夹的实现

在进行程序开发的过程中,我们经常要在主机与虚拟机之间传递文件,比如说,源代码位于虚拟机,而在主机下阅读或修改源代码,这里就需要使用到 「共享文件」 这个机制了。本文介绍了两种共享文...

良许Linux
今天
5
0
JUC锁框架——AQS源码分析

JUC锁介绍 Java的并发框架JUC(java.util.concurrent)中锁是最重要的一个工具。因为锁,才能实现正确的并发访问。而AbstractQueuedSynchronizer(AQS)是一个用来构建锁和同步器的框架,使用A...

长头发-dawn
今天
3
0
docker中安装了RabbitMQ后无法访问其Web管理页面

在官网找了"$ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq:3-management"这条安装命令,在docker上安装了RabbitMQ,,结果输入http://localhost:8080并不......

钟然千落
今天
4
1
spring-cloud | 分布式session共享

写在前面的话 各位小伙伴,你们有福了,这一节不仅教大家怎么实现分布式session的问题,还用kotlin开发,喜欢kotlin的小伙伴是不是很开心! 以前在写Android的时候,就对客户端请求有一定的认...

冯文议
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部