Дрейф состояния (erikbern.com) 11 сентября 2016
Эрик Бернхардссон описывает проблему «дрейфа состояния». Она возникает, когда есть два компонента, между которыми должны синхронизироваться данные:
- Компонент-издатель, который отсылает компоненту-подписчику изменения.
- Сторонний сервис, который присылает уведомления нашему сервису с помощью вебхуков.
- Бэкенд, который отправляет новые данные на фронтенд через вебсокеты.
Какие-то из уведомлений обязательно потеряются. Причин этому много — TCP-соединения разрываются; сообщения приходят, когда подписчик лежит; баги в коде мешают правильно отправить или принять сообщения. Между компонентами начинает накапливаться расхождение в состояниях.
Решения два:
- Обеспечить твердые гарантии доставки сообщения. (Например, как Кафка.)
- Добавить подписчику механизм самоисправления, когда он сам полностью перезагружает состояние из источника.
В идеале нужно реализовать оба.