Медленное стороннее API засоряет Express сервер - PullRequest
0 голосов
/ 16 марта 2020

Я создаю приложение для ответа на вопросы, используя Node.js + Express для моего бэкэнда. Интерфейс отправляет данные вопроса на сервер, который, в свою очередь, отправляет запросы нескольким сторонним API для получения данных ответов.

Проблема в том, что некоторые из этих сторонних API слишком долго ответить, так как они должны сделать некоторую интенсивную обработку и вычисления. По этой причине я уже внедрил систему кэширования, которая сохраняет данные ответов для каждого отдельного вопроса. Тем не менее, каждый первый запрос может занять до 5 минут .

Поскольку мой внутренний сервер ждет и не отвечает обратно на внешний интерфейс до тех пор, пока не поступят данные (соединения остаются открытыми), он может одновременно обслуживать только 6 запросов (это то, что я обнаружил). Это недопустимо с точки зрения производительности.

Что бы обойти эту проблему? Есть ли способ не «засорить» сервер, чтобы он мог обслуживать более 6 пользователей?
Существует ли схема проектирования, при которой серверы дают первоначальный ответ, а затем подают полные данные?
Возможно что-то, что устанавливает запрос на «сон» и открывает пространство для новых подключений?

1 Ответ

0 голосов
/ 17 марта 2020

Ваш сервер может обслуживать многие тысячи одновременных запросов, если все правильно закодировано и не потребляет много ресурсов процессора, просто ожидает сетевых ответов. Это то, в чем node.js особенно хорош.

Один браузер, однако, будет отправлять только несколько запросов за раз (это зависит от браузера) к одной и той же конечной точке (ставить другие в очередь до более ранней версии). Фини sh). Итак, я думаю, что вы пытаетесь проверить это из одного браузера. Это не собирается проверять то, что вы действительно хотите проверить, потому что сам браузер ограничивает количество одновременных запросов. node.js особенно хорош при большом количестве запросов в полете одновременно. Это может легко сделать тысячи.

Но, если у вас действительно есть операция, которая занимает до 5 минут, это, вероятно, даже не сработает для http-запроса от браузера, потому что браузер, вероятно, истечет время ожидания неактивного Соединение все еще ждет результата.

Я могу придумать пару возможных решений:

Во-первых, вы могли бы сделать первый запрос http, чтобы просто запустить процесс и немедленно вернуть его с помощью Я БЫ. Затем клиент может проверять каждые 30 секунд, после чего отправляет идентификатор в запросе http, и ваш сервер может ответить, есть ли у него результат или нет для этого идентификатора. Это будет решение для опроса клиентов.

Во-вторых, вы можете установить sh соединение webSocket или socket.io от клиента к серверу. Затем отправьте сообщение через этот сокет, чтобы начать запрос. Затем, когда сервер заканчивает свою работу, он может просто отправить результат напрямую клиенту через соединение webSocket или socket.io. Получив ответ, клиент может либо оставить соединение webSocket / socket.io открытым для использования в будущем, либо он может закрыть его.

...