Сделать строгую консистентность в рамках одного дата-центра — задача решаемая. Но что, если у нас реплики в Москве, Нью-Йорке и Сингапуре?
Здесь нашим главным врагом становится скорость света. Свет в оптоволокне идет долго. Пинг между США и Азией может составлять 150-200мс. Заблокировать транзакцию глобально на такое время — значит убить всю производительность.
Как это решают?
1. Читерство с физикой: Google Spanner и TrueTime
Обычный протокол NTP имеет погрешность. У разных серверов время всегда немного разъезжается. Из-за этого сложно понять, какая транзакция была первой на глобальном уровне. Google поставили в каждый свой датацентр аппаратные атомные часы и GPS-приемники (TrueTime API).
- Система всегда знает точное время с погрешностью всего в пару миллисекунд.
- Spanner искусственно ждет (commit wait) эти пару миллисекунд перед подтверждением транзакции, чтобы гарантировать: ни в одной точке мира время этой транзакции не окажется в прошлом.
2. Обход физики через детерминизм: FaunaDB и Calvin
Если нет денег на атомные часы, можно использовать детерминистическое выполнение (протокол Calvin).
- Вместо того чтобы блокировать данные и долго их реплицировать, мы сначала глобально упорядочиваем сами запросы.
- Все реплики в мире получают одинаковый, строгий лог того, что нужно сделать.
- Поскольку все выполняют одно и то же в одном и том же порядке, результат на всех континентах будет консистентным (Strict Serializability) без необходимости постоянно пинговать друг друга для блокировок.