Это правда, что node.js может получать или отвечать только на один запрос за раз, однако он может обрабатывать несколько запросов одновременно.
Например, предположим, что у вас есть приложение node.js, которое является остальным API, и каждый запрос приводит к вызову базы данных, за исключением конечной точки C. Остальные API имеют 3 конечных точки.
Конечная точка A: требуется 3 секунды, чтобы поговорить с базой данных
Конечная точка B: требуется 2 секунды, чтобы поговорить с базой данных
Конечная точка C: не взаимодействует с базой данных, она просто возвращает статический текст.
Одновременно не может быть более 1 запроса. Один всегда первый, независимо от того, насколько близки временные метки.
Теперь предположим, что у нас одновременно происходит 10 запросов в следующем порядке:
АВСВССКААБК
Вот как они будут получены и как на них ответят:
REC:A
REC:B
REC:C
RESP:C
REC:B
REC:C
RESP:C
REC:C
RESP:C
REC:A
REC:A
REC:B
REC:C
RESP:C
// 2 seconds later
RESP:B
RESP:B
RESP:B
// 1 second later
RESP:A
RESP:A
RESP:A
C всегда происходит немедленно, потому что он не выполняет никаких асинхронных действий. Затем вы получаете все B, а затем все A, потому что B быстрее, чем A.
Порядок B и A может различаться в зависимости от настройки базы данных, например, если она настроена на обработку только x запросов за раз.
Если мы ввели и конечную точку D, которая выполняет синхронное действие, которое занимает 6 секунд, вы получите такой результат:
АДАБК
REQ:A
REQ:D
// 6 long seconds later...
RESP:D
REQ:A
REQ:B
REQ:C
RESP:C
// 2 seconds later...
RESP:B
// 1 second later...
RESP:A
RESP:A
потому что D останавливает всю обработку javascript, пока происходит синхронное действие. 1 конечная точка, которая выполняет синхронное действие, является легкой точкой отказа для кого-то, кто может остановить ваш API.
person
Kevin B
schedule
17.10.2014