【问题标题】:How to choose the right value for the expiryTime parameter for RedLockFactory.CreateLockAsync() method?如何为 RedLockFactory.CreateLockAsync() 方法的 expiryTime 参数选择正确的值?
【发布时间】:2021-10-21 15:14:49
【问题描述】:

我正在使用 RedLock.net 库进行资源锁定。为了锁定资源,我使用 RedLockFactory.CreateLockAsync。

public async Task<IRedLock> RedLockFactory.CreateLockAsync(string resource,
      TimeSpan expiryTime,
      TimeSpan waitTime,
      TimeSpan retryTime,
      CancellationToken? cancellationToken = null)

我了解此方法将尝试通过不断重试每个retryTime 来获取waitTime 的锁。但是我不明白expiryTime 的正确值是多少。 一旦获得了锁,它将一直保留到锁为Disposed,这与expiryTime无关。换句话说,即使expirtyTime 设置为 5 秒,如果锁仅在 10 秒后被释放,那么锁将保持 10 秒。

在许多示例中,使用 30 的值没有任何解释。
我已经用 0 的值进行了测试。根本没有获得锁。
我已经用 5 毫秒的值进行了测试。获取锁并保留直到释放。

那么如何为expiryTime参数选择合适的值呢?在我看来,这个参数是不必要的,任何非零正值都可以。

【问题讨论】:

    标签: redlock.net redlock


    【解决方案1】:

    ExpiryTime 确定在发生故障时(例如,持有锁的进程崩溃)持有锁的最长时间。它还间接决定了锁在被持有时更新的频率。

    例如

    如果您将到期时间设置为 10 分钟:

    • 自动锁更新计时器将每 5 分钟(到期时间/2)调用一次 redis 以延长锁
    • 如果您的进程在未释放锁的情况下崩溃,您将不得不等待最多 10 分钟,直到密钥在 redis 中过期,另一个进程可以在同一资源上获取锁

    如果您将过期时间设置为 10 毫秒:

    • 自动锁更新计时器将每 5 毫秒(到期时间 / 2)调用一次 redis 以延长锁(可能有点过度)
    • 如果您的进程在没有释放锁的情况下崩溃,您将不得不等待最多 10 毫秒,直到密钥在 redis 中过期,另一个进程可以在同一资源上获取锁

    这是在失败情况下您愿意等待锁过期的时间与您在 Redis 服务器上施加多少负载之间的平衡。

    【讨论】:

      猜你喜欢
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      • 2017-01-05
      相关资源
      最近更新 更多