Eventual Consistency (согласованность в конечном счете) — это модель согласованности данных в распределенных системах, при которой система гарантирует, что если в данные не вносятся новые изменения, то через некоторое время все узлы системы придут к согласованному состоянию. Это означает, что данные могут быть временно несогласованными, но в конечном итоге они станут согласованными.
Рассмотрим пример распределенной системы, где данные реплицируются между несколькими узлами. Например, система хранения пользовательских профилей.
// Класс, представляющий пользовательский профиль
public class UserProfile {
private String userId;
private String name;
private String email;
// Конструктор, геттеры и сеттеры
public UserProfile(String userId, String name, String email) {
this.userId = userId;
this.name = name;
this.email = email;
}
public String getUserId() {
return userId;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
public void setName(String name) {
this.name = name;
}
public void setEmail(String email) {
this.email = email;
}
}
// Сервис для работы с пользовательскими профилями
public class UserProfileService {
private Map<String, UserProfile> node1 = new HashMap<>();
private Map<String, UserProfile> node2 = new HashMap<>();
// Метод для обновления профиля на первом узле
public void updateProfileOnNode1(UserProfile profile) {
node1.put(profile.getUserId(), profile);
replicateToNode2(profile); // Асинхронная репликация на второй узел
}
// Метод для обновления профиля на втором узле
public void updateProfileOnNode2(UserProfile profile) {
node2.put(profile.getUserId(), profile);
replicateToNode1(profile); // Асинхронная репликация на первый узел
}
// Асинхронная репликация данных
private void replicateToNode2(UserProfile profile) {
new Thread(() -> {
try {
Thread.sleep(1000); // Имитация задержки сети
node2.put(profile.getUserId(), profile);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
private void replicateToNode1(UserProfile profile) {
new Thread(() -> {
try {
Thread.sleep(1000); // Имитация задержки сети
node1.put(profile.getUserId(), profile);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
// Метод для получения профиля с любого узла
public UserProfile getProfile(String userId) {
UserProfile profile = node1.get(userId);
if (profile == null) {
profile = node2.get(userId);
}
return profile;
}
}
Eventual Consistency — это модель согласованности, которая позволяет распределенным системам работать с высокой производительностью и масштабируемостью, допуская временную несогласованность данных. Она подходит для систем, где допустима задержка в обновлении данных, таких как социальные сети, системы рекомендаций и кэширования. Однако для систем, требующих строгой согласованности (например, финансовых), эта модель не подходит.