Могут ли два или более запроса обрабатываться точно одновременно в экспрессе? - PullRequest
0 голосов
/ 04 июля 2018

Я совершенно новичок в подобных случаях. Видите, я создаю спокойное приложение, основанное на экспресс-бэкенде и мобильном интерфейсе Существует два типа пользователей, скажем, клиенты и работники. Клиент может отправить уведомление всем работникам, говоря, что он ищет работника, поэтому все работники получают это уведомление, они должны принять или отклонить его, НО, только одно может быть принято, скажем, самое быстрое нажатие кнопки «Принять» , Итак, я сомневаюсь, что произойдет, если два сотрудника одновременно нажмут кнопку «Принять», и они будут получены (в тоже время) экспресс-службой? Они обрабатываются в одно и то же время? или тот факт, что узел является однопоточным, делает это невозможным? Я просто хочу быть уверен, что из-за вышеизложенного два (или более) работника могут быть назначены одному и тому же клиенту.

Я искал это в интернете, но не нашел ничего, что могло бы очистить мой разум от этой ситуации. И я, честно говоря, понятия не имею, с чего начать, поэтому любые предложения принимаются. Я видел такие вещи, как администраторы очередей для узла (например, Bull), но я думаю, что они не являются решением для этого случая, но я также не уверен в этом, мне нужен хотя бы кто-то, чтобы указать мне правильное направление на решение.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Использовать zookeeper или асинхронную блокировку https://www.npmjs.com/package/async-lock. Последнее, что вы хотите, это состояние гонки.

0 голосов
/ 04 июля 2018

Простым, но, возможно, не таким хорошим решением для блокировки является транзакция базы данных. Как только первый работник примет задание, он добавит флаг в базу данных. Второй работник мог запустить транзакцию базы данных, но в конечном итоге не смог завершить процесс, так как флаг был установлен предыдущим работником. Затем откат всей транзакции.

0 голосов
/ 04 июля 2018

Если вы не используете блокировки, вы не можете исключить такую ​​возможность.

Узел может быть однопоточным , теперь (это не так), и он может обслуживать одного пользователя, прежде чем перейти к следующему (что, по его мнению, нет), но если вы не можете найти это написано в документации, тогда это вовсе не гарантия. Всегда существует вероятность того, что обновление может изменить способ его работы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...