Гонка событий — ситуация, при которой результат работы системы зависит от порядка выполнения операций
Если несколько процессов одновременно работают с одним состоянием, итог может быть непредсказуемым
Может возникать в:
Система может работать корректно, а затем случайно выдать ошибку
Когда возникает
Типичные признаки
Причины
Гонка всегда связана с принципом:
Если изменение порядка приводит к разному результату — система подвержена гонке
Backend и микросервисы
Частый источник гонок — параллельные запросы к одному ресурсу
Например:
Базы данных
При использовании транзакций гонка не исчезает
Проблемы:
Брокеры сообщений
Не гарантируют отсутствие гонок
Создают условия, при которых она возникает
Проблемы:
Распределенные системы
В распределённых системах гонка — нормальное состояние среды
Причины:
Примеры
Микросервисы с общей БД
Оба сервиса:
1. читают одну запись
2. меняют локальную копию
3. сохраняют объект полностью.
Последний
UPDATE уничтожает изменения другого сервисаКак решать
Event-driven архитектура
Сервис публикует:
OrderCreatedOrderCancelledПотребитель получает их в обратном порядке
Клиент сначала получает письмо: «Заказ отменён»
А затем: «Заказ успешно создан»
Как решать
orderId1. Небезопасная многопоточность или Race Condition
2. Что такое состояние гонки
3. Почему стоит проверять приложения на устойчивость к race condition
4. Разница между Data Race и Race Condition
📚 Книги
1. Высоконагруженные приложения - Мартин Клеппман
2. Микросервисы. Паттерны разработки и рефакторинга - Крис Ричардсон
3. Шаблоны корпоративных приложений - Мартин Фаулер
4. Release it! Проектирование и дизайн ПО для тех, кому не всё равно - Майкл Нейгард
#проектирование


