Здравствуйте! Интересует решение вопроса в API сервисе со стеком:
- NodeJS 10
- MongoDb 4.00
- Mongoose ODM
Суть такова: сервис по бронированию мест в отеле предоставляет доступность номеров . Но если в 1 секунду или менее 2 пользователя забронируют последнее место , то бронь сработает сразу у двоих , поскольку первый запрос на доступ к брони отработает быстрее , чем второй , который вычтет и сохранит. Например:
На 1 место претендуют два человека и в ту же секунду оформляют оба одновременно. Выполняется у обоих чтение доступных мест и у обоих последнее место доступно . Но у первого бронь срабатывает раньше и место обновляется ,(read=1-1) - запишешься 0(не доступно) у второго точно также. Получается оба забронировали 1 место.
Я думаю копать нужно в Монго чтобы настроить консистентность. Как вы думаете?
Копать надо в сторону ACID транзакций, блокировок записей и обновлений записей с условиями. (На примере SQL: update table set free = 0 where id=1 and free =1 and updated =13677742126)
Была похожая ситуация только с логами, которые тоже писались в базу. Тут надо делать очередь, то есть всё закидывается в очередь и каждый в очереди проверяет, свободное ли место.