Самая большая архитектурная ложь заключается в том, что работающая инфраструктура якобы означает работающую систему в целом.
Это не так.
Брокер работает исправно.
Все сервисы подключены к интернету.
Поступает множество сообщений.
Информационные панели зелёненькие.
И все же, каким-то образом, на выходе по-прежнему получается неправильный результат.
С клиента берётся двойная плата. Возврат средств происходит до реальной оплаты. Заказ записан в базу данных, но ни одна из связанных с ней служб об этом не знает. Безобидное на вид изменение конфигурации прерывает работу, не вызывая видимых сбоев.
Это и есть настоящая трудность в highload-системах (прежде всего, управляемых событиями). Они редко выходят из строя из-за масштабных инцидентов с инфраструктурной доступностью. Они выходят из строя из-за незначительных ошибок, которые проявляются в повторных запросах сервисов, неверного упорядочивания по времени, дублирующих записей и нарушения консистентности.
1. Поднимите эффекты на уровень типов (например, Async в F#).
Любое изменение конфигурации, чтение БД, вызов внешней службы или запрос текущего времени, должны быть явно "заданы" подходящими типами в сигнатурах функций. Тогда даже "безобидное изменение конфигурации" не сможет прервать работу незаметно: оно станет частью цепочки эффектов, которую придётся обработать или задокументировать, иначе компилятор выдаст ошибку.
Остальные рекомендации будут ментатам в Функциональных архитектурах и на консультациях.
ps. ...пока синий самолётик летит, жива страна!
Post #2365
632
- ❤ 40
- ✍ 9
- 👍 4