Я не нашел хорошего ответа в Google, поэтому пробую здесь.
Мое приложение состоит из: Express.js, node.js и базы данных MySQL. Однако это приложение должно обслуживать несколько клиентов.
В моем коде мне нужно использовать обратные вызовы, чтобы программа ожидала выполнения запроса к базе данных, прежде чем двигаться дальше. Повлияет ли это на других пользователей, которые хотят получить доступ к базе данных одновременно?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Чтобы явно ответить на этот вопрос, я думаю, требуется более глубокое понимание цикла асинхронных событий Node.js.
JavaScript является однопоточным, и использование этого асинхронного цикла событий позволяет Node.js выполнять неблокирующие операции ввода-вывода в этом единственном потоке.
Это достигается путем передачи операций в ядро, когда это необходимо (например, при большом количестве запросов или операций ввода-вывода), а затем получения результата в более позднее время в цикле событий, в фаза «опроса».
Чтобы дать дополнительные пояснения, я включил диаграмму, представленную в документации Node.js:
┌───────────────────────────┐
┌─>│ timers │
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
│ │ pending callbacks │
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
│ │ idle, prepare │
│ └─────────────┬─────────────┘ ┌───────────────┐
│ ┌─────────────┴─────────────┐ │ incoming: │
│ │ poll │<─────┤ connections, │
│ └─────────────┬─────────────┘ │ data, etc. │
│ ┌─────────────┴─────────────┐ └───────────────┘
│ │ check │
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
└──┤ close callbacks │
└───────────────────────────┘
Более подробно об этих этапах можно прочитать по адресу: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
Вкратце:
Опять же, большая часть этого взята из документации Node.js, но я немного подробно остановился на некоторых деталях, чтобы обеспечить некоторое понимание в этом контексте.
В вашем случае операции с вашей базой данных не будут «блокировать» других пользователей, им просто нужно будет ждать, пока их обратные вызовы не будут обработаны через цикл. Если бы выполнялось много операций одновременно, большее количество операций было бы выгружено в ядро, а затем загружено как можно скорее, что может вызвать небольшую дополнительную задержку (1).
Еще один хороший рисунок, который поможет визуализировать этот процесс, взят из этой статьи: https://webapplog.com/you-dont-know-node/
На стороне примечания -
Есть места, где цикл обработки событий Node.js является хорошим решением, и другие места, где более надежное многопоточное решение может быть лучшим подходом. Никогда не бывает плохой идеей обязательно провести исследование, необходимое для разумного принятия решения, связанного со спецификой вашего проекта.
(1) Есть несколько статей о различиях в производительности, ожидаемой задержке при больших нагрузках на сеть и различных решениях этой проблемы, которые находятся в поиске в Google.
Надеюсь, это поможет!