Nikkorfed
@Nikkorfed
20 лет, веб-разработчик из Екатеринбурга.

Как правильно реализовать обработку одновременных запросов к бэкенду?

Здравствуйте! Использую Node.js и npm-пакет google-spreadsheet в качестве бэкенда для бота в Telegram, который отслеживает количество продукции на складе и позволяет сделать заказ на определённый объем этой продукции. Все данные берутся из гугл таблицы. При заказе бот проверяет остаток продукции на складе и, если желаемый объем не превышает остаток, формирует заказ.

Суть проблемы в том, что когда одновременно два пользователя делают заказ, между проверкой остатка и формированием заказа для одного из пользователей, может быть сформирован второй заказ. JavaScript ведь работает асинхронно, с неблокирующим вводом/выводом, и такое регулярно случается. Скрипт проверяет доступный остаток, формируется второй заказ, а после этого формируется исходный заказ. В результате этого получается два заказа на общий объём, превышающий доступный остаток.

Подскажите пожалуйста, как быть в такой ситуации и как сделать так, чтобы не возникало такой путаницы, и при этом сохранить асинхронность и другие преимущества от использования Node.js?

Похожая ситуация получается и при работе с файлами — если прочитать файл, изменить полученные данные и сохранить их, а в перерыве между этими операциями изменить файл сторонним скриптом, то часть данных потеряется. Суть та же.

Надеюсь на вашу помощь. Спасибо!)
  • Вопрос задан
  • 436 просмотров
Решения вопроса 1
Robur
@Robur
Знаю больше чем это необходимо
Это вы серезную проблему на самом деле затронули.
варианта два
- либо сделать блокировки на уровне БД, где над такой проблемой подумали бородатые дядьки и придумали разные решения (и вам нужна будет нормальная БД)
- либо поменять систему так чтобы такой проблемы вообще не было - обеспечить обработку только одного заказа в один момент времени, если у вас скрипт работает в единственном экземпляре, то вы можете приостановить обработку всех остальных заказов, если уже какой-то один обрабатывается. Например завести очередь, при поступлении заявки класть ее в эту очередь, брать и обрабатывать по одному от начала и до конца, и когда один заказ полностью завершился и сформирован, брать следующий, обрабатывать его.

городить какие-то свои блокировки поверх гугл-таблиц - гиблое дело, вы уменьшите вероятность, но не уберете ее полностью.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Poznakomlus
@Poznakomlus
Программист: php, js, go
https://nodejs.org/ru/docs/guides/timers-in-node/
Используйте setImmediate
В файлах блокировки стоит использовать. И это не одно и то-же
Шаблоны проектирования Node.js / пер. с анг. А. Н. Киселева. – М.: ДМК Пресс,
2017. – 396 с.: ил.
ISBN 978-5-97060-485-4
С 300 страницы описывают решение подобных проблем
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
29 нояб. 2020, в 19:24
95000 руб./за проект
29 нояб. 2020, в 18:43
10000 руб./за проект
29 нояб. 2020, в 16:24
30000 руб./за проект