Как eureka peers гарантируют, что регистрационная информация непротиворечива при сбое действия синхронизации
PeerAwareInstanceRegistryImpl будет синхронизироваться с другими одноранговыми узлами при изменении регистрации, код выглядит следующим образом:
private void replicateInstanceActionsToPeers(Action action, String appName,
String id, InstanceInfo info, InstanceStatus newStatus,
PeerEurekaNode node) {
try {
InstanceInfo infoFromRegistry = null;
CurrentRequestVersion.set(Version.V2);
switch (action) {
case Cancel:
node.cancel(appName, id);
break;
case Heartbeat:
InstanceStatus overriddenStatus = overriddenInstanceStatusMap.get(id);
infoFromRegistry = getInstanceByAppAndId(appName, id, false);
node.heartbeat(appName, id, infoFromRegistry, overriddenStatus, false);
break;
case Register:
node.register(info);
break;
case StatusUpdate:
infoFromRegistry = getInstanceByAppAndId(appName, id, false);
node.statusUpdate(appName, id, newStatus, infoFromRegistry);
break;
case DeleteStatusOverride:
infoFromRegistry = getInstanceByAppAndId(appName, id, false);
node.deleteStatusOverride(appName, id, infoFromRegistry);
break;
}
} catch (Throwable t) {
logger.error("Cannot replicate information to {} for action {}", node.getServiceUrl(), action.name(), t);
}
}
Меня смущает распределенная согласованность нескольких серверов eureka - когда действие репликации завершается неудачей - оно просто ловит бросаемый объект. Почему бы не использовать алгоритмы согласованности, такие как сплетни, паксос, чтобы обеспечить более высокую согласованность?
Я видел описание вики и знаю, что eureka просто допустила временную несогласованность - сервер пытается быть максимально устойчивым... Ага, теория ограничений!