Node.js и ЦП интенсивные запросы

Я начал переделывать сервер HTTP Node.js и действительно люблю писать стороне сервера JavaScript, но что-то мешает мне начинать использовать Node.js для своего веб-приложения.

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

Насколько я понимаю сервер будет очень быстр для простых запросов веб-страницы, таких как просмотр списка пользователей или просмотра сообщения в блоге. Однако, если я захочу написать очень ЦП интенсивный код (в администраторском бэкэнде, например), который генерирует графику или изменяет размер тысяч изображений, то запрос будет очень медленным (несколько секунд). Так как этот код не асинхронен, каждый, запросы, прибывающие в сервер в течение тех нескольких секунд, будут заблокированы, пока мой медленный запрос не сделан.

Одно предложение состояло в том, чтобы использовать Рабочих по сети для ЦП интенсивные задачи. Однако я - испуганные веб-рабочие, будет мешать писать чистый код, так как он работает включением отдельного файла JS. Что, если ЦП интенсивный код расположен в методе объекта? Это отчасти сосет для записи файла JS для каждого метода, который является интенсивным ЦП.

Другое предложение состояло в том, чтобы породить дочерний процесс, но это делает код даже менее удобным в сопровождении.

Какие-либо предложения для преодоления этого (воспринятого) препятствия? Как Вы пишете чистый объектно-ориентированный код с Node.js при проверке ЦП, тяжелые задачи выполняются асинхронные?

205
задан Olivier Lalonde 15 August 2010 в 22:04
поделиться

3 ответа

Вам нужна очередь задач! Перенести ваши давно выполняющиеся задачи с веб-сервера - это ХОРОШО. Хранение каждой задачи в «отдельном» js-файле способствует модульности и повторному использованию кода. Это заставляет задуматься о том, как структурировать вашу программу таким образом, чтобы облегчить ее отладку и поддержку в долгосрочной перспективе. Еще одно преимущество очереди задач - рабочие могут быть написаны на другом языке. Просто поставьте задачу, выполните работу и напишите ответ.

что-то вроде этого https://github.com/resque/resque

Вот статья с github о том, зачем они это сделали http://github.com/blog/542-introduction -resque

52
ответ дан 23 November 2019 в 04:52
поделиться

Это неправильное понимание определения веб-сервера - его следует использовать только для «разговора» с клиентами. Задачи с большой нагрузкой следует делегировать автономным программам (которые, конечно, также могут быть написаны на JS).
Вы, вероятно, сказали бы, что это грязно, но я уверяю вас, что процесс веб-сервера, застрявший в изменении размера изображений, просто хуже (даже для, скажем, Apache, когда он не блокирует другие запросы). Тем не менее, вы можете использовать общую библиотеку, чтобы избежать избыточности кода.

РЕДАКТИРОВАТЬ: Я провел аналогию; веб-приложение должно быть как ресторан. У вас есть официанты (веб-сервер) и повара (рабочие). Официанты находятся в контакте с клиентами и выполняют простые задачи, например, предоставляют меню или объясняют, является ли какое-то блюдо вегетарианским. С другой стороны, они перекладывают более сложные задачи на кухню. Поскольку официанты делают только простые вещи, они быстро реагируют, и повара могут сосредоточиться на своей работе.

Node.js здесь будет единственным, но очень талантливым официантом, который может обрабатывать множество запросов за раз, а Apache будет бандой тупых официантов, которые просто обрабатывают по одному запросу каждый. Если бы этот официант Node.js начал бы готовить, это была бы немедленная катастрофа. Тем не менее, приготовление пищи могло утомить даже большое количество официантов Apache, не говоря уже о хаосе на кухне и постепенном снижении отзывчивости.

282
ответ дан 23 November 2019 в 04:52
поделиться

Пара подходов, которые вы можете использовать.

Как отмечает @Tim, вы можете создать асинхронную задачу, которая находится вне или параллельно вашей основной логике обслуживания. Зависит от ваших конкретных требований, но даже cron может действовать как механизм очередей.

WebWorkers могут работать с вашими асинхронными процессами, но в настоящее время они не поддерживаются node.js. Есть несколько расширений, которые обеспечивают поддержку, например: http://github.com/cramforce/node-worker

Вы по-прежнему можете повторно использовать модули и код через стандартный механизм «требует». Вам просто нужно убедиться, что первоначальная отправка работнику передает всю информацию, необходимую для обработки результатов.

7
ответ дан 23 November 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: