[Curator] Shared Semaphore 的使用与分析
[Curator] Shared Semaphore 的使用与分析
秋雨霏霏 发表于7个月前
[Curator] Shared Semaphore 的使用与分析
  • 发表于 7个月前
  • 阅读 17
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: Zookeeper 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的部分。

共有 人打赏支持
粉丝 115
博文 75
码字总数 138343
×
秋雨霏霏
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: