Используя java Консульский клиент OrbitzWorld, я пытаюсь синхронизировать несколько экземпляров моего приложения java с помощью метода acquireLock
.
Мой код пока:
Зарегистрируйте приложение в качестве консула:
private void registerService(Config config) {
String serviceId = config.getService().getId();
String serviceName = config.getService().getName();
long ttl = config.getService().getTtl();
AgentClient agentClient = client.agentClient();
Registration service = ImmutableRegistration.builder()
.id(serviceId)
.name(serviceName)
.check(Registration.RegCheck.ttl(ttl))
.build();
agentClient.register(service);
new HeartBeater(agentClient, serviceId, ttl).start();
}
HeartBeater:
@Override
public void run() {
while(true) {
try {
client.pass(serviceId);
Thread.sleep((Math.max(ttl / 2, 1)));
} catch (NotRegisteredException | InterruptedException e) {}
}
}
Приведенный выше код работает и сервис успешно обновляется в консуле.
Теперь мне интересно о реализации блокировки.
То, что я написал до сих пор:
public boolean amILeader() {
// return if current java app is leader
}
private String createSession() {
final Session session = ImmutableSession.builder().name(config.getService().getName()).build();
return client.sessionClient().createSession(session).getId();
}
private void watchLeaderLockStateChange() {
KeyValueClient keyValueClient = client.keyValueClient();
KVCache kvCache = KVCache.newCache(keyValueClient, Constants.LEADER_LOCK_KEY, config.getService().getWatchKey());
kvCache.addListener(map -> {
Value value = map.get(Constants.LEADER_LOCK_KEY);
if(!value.getSession().isPresent()) {
keyValueClient.acquireLock(Constants.LEADER_LOCK_KEY, ???); //create new session here ???
}
});
kvCache.start();
}
Я застрял здесь, так как не понимаю теорию и не нашел ничего полезного в документации.
Мои вопросы:
- является ли сеанс необходимым для синхронизации с помощью метода
acquireLock
? - , если да, когда и каким образом сеанс должен быть создано / синхронизировано через?
- является ли сессия недействительной обычным делом? Согласно документации, это происходит, если одна из служб не может отправить ttl, что может быть очень часто.
- как живые службы синхронизируются при создании нового сеанса?
- как службы синхронизируются over lock?
Можете ли вы привести примеры кода или заполнить мою реализацию? Спасибо за любой ответ:]