Короткий ответ
Выбор между строгой и eventual consistency для остатков зависит от того, что дороже бизнесу — продать товар, которого уже нет (overselling), или искусственно снижать доступность/throughput операции покупки из-за блокировок при строгой согласованности; универсального решения нет.
Как это работает подробнее
Строгая согласованность обычно требует синхронной проверки и резервирования остатка в момент покупки (условное обновление WHERE stock >= qty), что исключает overselling, но ограничивает параллелизм на горячих товарах; eventual consistency допускает локальное/кешированное представление остатка с редким overselling, компенсируемым постфактум.
Строгая согласованность снижает риск overselling, но повышает латентность под нагрузкой на горячих товарах и требует постоянной доступности источника правды (узкое место, например, в «чёрную пятницу»); eventual consistency масштабируется лучше и переживает временную недоступность части системы, но требует спроектированного и протестированного процесса компенсации overselling и готовности бизнеса принимать такие случаи. Критерий выбора — ожидаемая частота конфликтов, стоимость одного случая overselling и готовность инвестировать в автоматическую компенсацию.
Пример кода
-- строгий вариант: атомарное условное списание остатка
UPDATE stock SET quantity = quantity - 1
WHERE product_id = 42 AND quantity > 0
RETURNING quantity;
-- если 0 строк затронуто — остатка нет, заказ не создаётсяЧто использовать на практике
- Практика. Для высокомаржинальных, лимитированных товаров overselling особенно болезненен репутационно — оправдана строгая согласованность даже с потерей throughput; для товаров с большим запасом и низкой вероятностью одновременного исчерпания эвентуальная модель с редкой компенсацией дешевле и быстрее.
Подводные камни
- Риск. Применять строгую блокировку остатка для всех товаров независимо от объёма и маржинальности; выбирать eventual consistency без продуманного автоматизированного процесса компенсации overselling.