Задать вопрос
Nikkorfed
@Nikkorfed
Full-Stack JavaScript Developer

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

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

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

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

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

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

городить какие-то свои блокировки поверх гугл-таблиц - гиблое дело, вы уменьшите вероятность, но не уберете ее полностью.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы