[Curator] Shared Semaphore 的使用与分析

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的部分。

转载于:https://my.oschina.net/roccn/blog/912697

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值