Как выжить в мире распределенных систем?
В мире распределенных систем выживают только параноики. Не полный список, с чем вам точно придется столкнуться:
- Сеть будет ломаться
- Сервера будут падать в самые не подходящие моменты
- Сообщения в очередях будут приходить в случайном порядке, повторяться и теряться
Опасайтесь мыслей вроде “все будет хорошо” или “вероятность этого крайне мала”. Старайтесь следовать самым базовым правилам:
- При любом сетевом вызове задавайте таймауты на запрос. Это касается и сервера и клиента. Используйте таймауты на весь запрос, а не только отдельно на чтение, запись или соединение, если ваш http клиент это поддерживает.
- Используйте transactional outbox паттерн каждый раз, когда вы в рамках транзакции в БД хотите отправить сообщение в очередь, записать файл на диск или сделать HTTP запрос на запись. Это позволит избежать dual write проблемы.
- Старайтесь делать API вызовы идемпотентными. Всегда думайте что произойдет, если вызвать ваш API два раза с одними и теми же данными. Если среди данных вашего запроса нет никаких полей, которые можно было бы естественным образом использовать для дедупликации, то не поленитесь такое поле добавить. Что-то вроде уникального request_id, который можно записать в БД вместе с остальными данными.
- Пишите код так, чтобы любой сервис нормально работал в несколько запущенных экземпляров. Тот же kubernetes не дает гарантий, что в любой момент времени количество запущенных pod’ов в ReplicaSet не будет превышать желаемое количество. Что произойдет, если два экземпляра одновременно получат команды на изменение одной сущности? Используйте пессимистичную или оптимистичную блокировку.