Я использую [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!"
Можно ли продолжать попытки, пока он не будет заблокирован
Спасибо
Джк