Как сделать, чтобы работала блокировка для большого количества запросов? Здравствуйте. Дело в том, что я использую сокеты. И почти в одно и то же время, допустим, в 20 часов и 0 минут, у всех пользователей скрипт отправляет запрос на сокет сервер. Отправляя этот запрос, у меня есть цель: выполнить нужное мне событие (1.1) один раз, и вернуть всем результаты. Но у меня не совсем получается. Я делаю так: когда приходит запрос от пользователя я проверяю, был ли запрос раньше, и если не было, помечаю в базе, что запрос только что произошел. Дальше, если еще кто-то шлет запрос, то уже видно, что запрос уже произошел, и текущий клиент ждет выполнения нужного мне события (1.1). Проблема состоит в том, что иногда Node.JS не успевает выполнить запрос к базе, и за это время, пока идёт запрос, успевает "проскочить" несколько клиентов и нужно мне события (1.1) выполняется столько раз, сколько пользователей проскочило, плюс тот пользователь, что инициировал первый запрос. Как быть? Может есть какой-то алгоритм? Уже голову сломал.
Для решения данной проблемы с блокировкой для большого количества запросов, вам может помочь использование механизма семафоров или мьютексов.
Вы можете создать глобальный семафор или мьютекс, который будет блокировать доступ к выполнению события (1.1) и разблокировать его только после выполнения этого события. Таким образом, при поступлении новых запросов на выполнение события (1.1), они будут ожидать, пока текущий запрос не будет выполнен.
Примерно таким образом это можно реализовать:
При получении запроса от пользователя проверяем состояние семафора/мьютекса.Если блокировка активна, то ждем разблокировки и добавляем текущий запрос в очередь.Если блокировка не активна, то блокируем ее, выполняем событие (1.1) и разблокируем после завершения.После разблокировки проверяем очередь запросов и выполняем их поочередно.
Таким образом, вы сможете гарантировать, что событие (1.1) будет выполнено только один раз и все запросы будут обработаны в правильном порядке.
Для решения данной проблемы с блокировкой для большого количества запросов, вам может помочь использование механизма семафоров или мьютексов.
Вы можете создать глобальный семафор или мьютекс, который будет блокировать доступ к выполнению события (1.1) и разблокировать его только после выполнения этого события. Таким образом, при поступлении новых запросов на выполнение события (1.1), они будут ожидать, пока текущий запрос не будет выполнен.
Примерно таким образом это можно реализовать:
При получении запроса от пользователя проверяем состояние семафора/мьютекса.Если блокировка активна, то ждем разблокировки и добавляем текущий запрос в очередь.Если блокировка не активна, то блокируем ее, выполняем событие (1.1) и разблокируем после завершения.После разблокировки проверяем очередь запросов и выполняем их поочередно.Таким образом, вы сможете гарантировать, что событие (1.1) будет выполнено только один раз и все запросы будут обработаны в правильном порядке.