Как выжить в мире распределенных систем?

В мире распределенных систем выживают только параноики. Не полный список, с чем вам точно придется столкнуться:

  • Сеть будет ломаться
  • Сервера будут падать в самые не подходящие моменты
  • Сообщения в очередях будут приходить в случайном порядке, повторяться и теряться

Опасайтесь мыслей вроде “все будет хорошо” или “вероятность этого крайне мала”. Старайтесь следовать самым базовым правилам:

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