Сильна узгодженість - після запису всі читання одразу бачать нове значення. Кінцева узгодженість (eventual consistency) - після запису різні частини системи якийсь час можуть бачити старе значення, але зрештою, якщо нових змін немає, усі побачать однакове.
Звідки береться:
- репліки бази: запис на основний сервер, читання з репліки, що відстає на мілісекунди чи секунди;
- асинхронна обробка: замовлення збережене, а пошуковий індекс, кеш і дашборд оновлюються подіями з черги;
- мікросервіси: кожен сервіс має свою базу, дані синхронізуються подіями;
- кеші й CDN.
Чому з нею миряться: це ціна доступності, продуктивності й незалежності частин системи. Сильна узгодженість між сервісами вимагала б розподілених транзакцій, які повільні й крихкі.
Як жити з нею в інтерфейсі:
- читати свої записи з основного джерела: після збереження профілю показувати дані з відповіді на збереження чи з основної бази, а не з репліки (у Laravel -
'sticky' => trueдля з'єднань з репліками); - оптимістичне оновлення: інтерфейс одразу показує зміну, не чекаючи, поки вона пройде всіма системами;
- чесні стани: «Замовлення приймається», «Оплата обробляється» замість миттєвого «Готово», якщо підтвердження приходить пізніше;
- оновлення в реальному часі: коли фонова обробка завершилася - подія через WebSocket оновлює екран.
Як жити з нею в бізнес-процесах:
- з'ясувати допустиму затримку з бізнесом: лічильник переглядів може відставати на хвилину, баланс рахунку при списанні - ні;
- компенсуючі дії замість заборон: якщо товар продано двічі через затримку синхронізації складу - процес повернення коштів чи заміни, а не спроба гарантувати неможливе;
- ідемпотентність і порядок обробки подій, щоб усі частини дійшли до однакового стану;
- узгодження (reconciliation): періодична перевірка й виправлення розбіжностей між системами.
Де кінцева узгодженість неприйнятна - інваріанти, порушення яких дороге: залишок коштів, унікальність логіна, бронювання місця. Для них - одна транзакція в межах одного агрегату чи сервісу, блокування, або явні резервування з підтвердженням.
Типова помилка: не помічати кінцевої узгодженості, доки користувачі не почнуть скаржитися на «зниклі» зміни після збереження.
Докладніше в документації: Martin Fowler: компроміси мікросервісів