Хорошие практики для возврата большого объема данных в узле

Я уже закодировал веб-сервер, используя Koa (nodeJs). Мне нужно вернуть большой объем данных из базы данных монго. Большой означает массив из примерно 750 000 данных json. Каждый элемент json содержит несколько строк.

Как правильно закодировать такой сервер, чтобы избежать его сбоя? Я открыт для всех советов :)

PS: моим клиентом будет Unity (c# или js).


person MrFlo    schedule 24.04.2017    source источник
comment
зачем сразу все возвращать? Первое, что приходит на ум, это gzip. Если он все еще недостаточно мал, используйте другой вид сжатия, чтобы уменьшить его. Но, честно говоря, я попытаюсь понять, зачем клиенту нужны все эти данные сразу.   -  person Tuan Anh Tran    schedule 24.04.2017
comment
Я занимаюсь визуализацией данных и хочу визуализировать их все одним кадром. Однако я могу загрузить их пачками.   -  person MrFlo    schedule 24.04.2017
comment
Если это так, вы можете захотеть обработать/агрегировать данные и на стороне сервера, чтобы отправлять меньше данных.   -  person Gabriel Littman    schedule 27.04.2017
comment
В большинстве случаев вы были бы правы, но в моем случае мне нужен весь набор данных   -  person MrFlo    schedule 27.04.2017


Ответы (2)


Node по умолчанию использует кодирование передачи по частям для HTTP, и с помощью потоков вы можете без проблем возвращать петабайты данных в одном запросе, по крайней мере, без проблем на сервер — наличие клиента для анализа этих данных — это совсем другая история.

Проблема заключается в сериализации больших данных в JSON, которая обычно является блокирующей операцией, требующей, чтобы все данные находились в памяти. Но доступны кодировщики потокового JSON.

Например, см. Big-Friendly JSON — функции асинхронной потоковой передачи для больших наборов данных JSON:

Смотрите также другие модули:

Также вам не нужно отправлять один большой JSON, вы можете разбить его на несколько объектов. И вам не нужно использовать JSON для сериализации данных. Вы можете использовать CSV, TSV или что-то еще, где ваши данные подходят. Вы ничего не сказали нам о своих данных, поэтому трудно дать вам конкретную рекомендацию.

person rsp    schedule 24.04.2017
comment
спасибо за вашу рекомендацию. Я использую mongodb, поэтому храню данные в json. Не конкретная причина, за исключением того, что мне было проще управлять (это ПЛОХАЯ причина). Я собираюсь проверить ваши модули, еще раз спасибо. - person MrFlo; 24.04.2017

Поскольку данные настолько велики, вы действительно хотите, чтобы все они были на клиенте одновременно? Если нет, другой простой вариант - разбить данные на страницы по нескольким запросам.

Запрос монго можно легко отменить с помощью параметров ограничения и пропуска в запросе поиска.

Вы можете передать это, используя параметры запроса http://example.com/large_data?skip=5000&limit=1000.

person Gabriel Littman    schedule 27.04.2017
comment
хорошее предложение! это именно тот синтаксис, который я искал! большое спасибо ! - person MrFlo; 27.04.2017