Асинхронная обработка данных в Expressjs - PullRequest
1 голос
/ 23 апреля 2020

У меня есть маршрут Express, который получает некоторые данные и обрабатывает их, а затем вставляет в mon go (используя mon goose).

Это работает хорошо, если я возвращаю ответ после выполняются следующие шаги:

  • Получение запроса
  • Обработка данных запроса
  • Вставка обработанных данных в пн go
  • Возврат 204 ответ

Но клиент будет вызывать этот API одновременно для миллионов записей. Следовательно, требование не блокировать клиента для обработки данных. Поэтому я внес небольшое изменение в код:

  • Получить запрос
  • Немедленно вернуть ответ с 204
  • Обработать запрошенные данные
  • Вставить обработанные данные в пн go

Вышеприведенное работает нормально для первых нескольких запросов (скажем, 1000 с), после того как клиент получил ошибку socket exception: connection reset peer. Я думаю, это потому, что сервер блокирует соединение, так как порт не свободен, и в какой-то момент я замечаю, что мой nodejs процесс выдает ошибку Out of memory.

Пример кода выглядит следующим образом:

async function enqueue(data) {
    // 1. Process the data
    // 2. Insert the data in mongo
}

async function expressController(request, response) {
    logger.info('received request')
    response.status(204).send()

    try {
        await enqueue(request.body)
    } catch (err) {
        throw new Error(err)
    }
}

Я что-то здесь не так делаю?

...