У меня есть маршрут 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)
}
}
Я что-то здесь не так делаю?