DDBLockClient - Не лидеры не будут соревноваться за лидерство после первой неудачи - PullRequest
0 голосов
/ 03 августа 2020

Я использую [DynamoDBLockClient] [1] для выбора ведущего узла

Ожидание:

Если узел мертв, новый узел должен стать лидером в следующие 12 секунд

Далее:

https://aws.amazon.com/blogs/database/building-distributed-locks-with-the-dynamodb-lock-client/

https://github.com/amazon-archives/dynamodb-lock-client

Реальность

Если ведущий узел мертв, другой узел / не ведущий не будет пытаться стать ведущим. Как установить блокировку DDB таким образом, чтобы, если лидер мертв, другой хост должен стать лидером в следующие 10 секунд

@Provides
public AmazonDynamoDBLockClient getLeaderSelectionLockClient(AmazonDynamoDB dynamoDB) {
  final AmazonDynamoDBLockClient client = new AmazonDynamoDBLockClient(
    AmazonDynamoDBLockClientOptions.builder(dynamoDB, LEADER_SELECTION_DDB_TABLE)
        .withTimeUnit(TimeUnit.SECONDS)
        .withLeaseDuration(10L)
        .withHeartbeatPeriod(3L)
        .withOwnerName(EC2MetadataUtils.getInstanceId())
        .withCreateHeartbeatBackgroundThread(true) //If true then leader will continue to be leader till it die
        .build());

  return client;
}

@Provides
public AcquireLockOptions getAcquireLockOptionsForEnchanter() {
    final String keyToLock = "LEADER";
    AcquireLockOptions acquireLockOptions = AcquireLockOptions
        .builder(keyToLock)
        .withRefreshPeriod(11L)
        .withTimeUnit(TimeUnit.SECONDS)
        .build();
    return acquireLockOptions;
}

public void competeForLeadership() {

    final String lockSuccessMessage =
        "Acquired lock! If I die, my lock will expire in 10 seconds Otherwise, I will hold it until I stop "
            + "heart beating." + EC2MetadataUtils.getInstanceId();
    try {
        final Optional<LockItem> lockItem = dynamoDBLockClient.tryAcquireLock(acquireLockOptions);

        if (lockItem.isPresent()) {
            log.info(lockSuccessMessage);
        } else {
            log.error("Failed to acquire lock!");
        }

    } catch (Exception e) {
        log.error("Leader Selector is down");
    }
}

Согласно документу https://www.mvndoc.com/c/com.amazonaws/dynamodb-lock-client/com/amazonaws/services/dynamodbv2/AcquireLockOptions.AcquireLockOptionsBuilder.html#withAdditionalTimeToWaitForLock - java .lang.Long -

withRefreshPeriod должно было решить эту проблему, но она не решает.

Как правильно настроить?

Похоже, tryAcquire не является блокирующий вызов, так как я вижу, что управление возвращается к коду после того, как не удалось получить блокировку с сообщением "Failed to acquire lock!"

Можно ли продолжать попытки, пока он не будет заблокирован

Спасибо

Джк

...