теория

Сеть, часы и паузы врут

Смотри, тут придётся расстаться с одной уютной иллюзией — что узлы в сети ведут себя как функции в твоём коде: позвал — ответили. В распределённой системе все три опоры, на которые хочется опереться, подводят.

Сеть ненадёжна. теряет, задерживает и дублирует сообщения. Ты отправил запрос и не получил ответа — и не знаешь: запрос не дошёл? дошёл, но ответ потерялся? узел жив, но медленный? узел мёртв? Единственный инструмент — : «не ответил за N секунд — считаем упавшим». Но это догадка, а не факт. Молчание неотличимо от смерти.

Часы врут. Хочется упорядочить события «по времени» — кто раньше нажал «оформить». Но и скачут: служба синхронизации может отвести их назад, и событие «из будущего» окажется «в прошлом». Настенные часы для порядка событий не годятся. Для измерения интервалов есть — они хотя бы не идут вспять, — но и они не синхронны между машинами.

Процессы замирают. Наш ночной герой. Любой процесс может застыть на секунды: , подкачка страниц, приостановка виртуалки. Изнутри паузы не видно — код просто продолжается со следующей строки, будто ничего не было. А снаружи за эти секунды тебя успели похоронить и выбрать преемника.

Сложим три вранья вместе — и получим нашу ночь: узел A замер (пауза), перестал отвечать (сеть молчит), его сочли мёртвым (таймаут-догадка) и выбрали B. А потом A ожил в уверенности, что всё ещё главный. Ни одна из трёх опор не подвела «по-настоящему» — просто мы им слишком верили.

← назад