Нужно организовать сборку angular приложения на сервере (ssr). Задача сама по себе ресурсоемкая. Есть и другие сложные вычисления, которые не хотелось бы выполнять в основном потоке.
Есть варианты, но все с недостатками:
- MQ Message broker (Kafka, RabbitMQ). Из минусов, оверхед на обмен сообщениями, хотелось бы моментально отдавать ответ.
- Node Cluster. Тут непонятно, сколько потоков создавать? Что делать если все потоки заняты, а результат нужен?
- Worker Threads. Минус - все в одном потоке, вычисления нормально не параллелятся. На сколько это будет влиять на основной поток?
Из всех перечисленных вариантов, серьезного опыта нет нигде. Хотелось бы услышать мнения других. Поделитесь опытом, как вы решаете проблему сложных вычислений в NodeJS?
SSR не такая уж сложная задача. Если он выполняется очень долго - тут уже вопросы к оптимизации вашего приложения.
Вообще, в первую очередь вам нужно ответить на два вопроса:
1. На какую нагрузку вы рассчитываете? Сколько rps ожидается?
2. Проводили ли вы уже какое-то нагрузочное тестирование? Вы уверены, что сейчас вам не хватит одного инстанса ноды?
Если количество запросов велико и один инстанс не справляется - я бы использовал поднял пару инстансов ноды с помощью, например, pm2, который выступит в роли балансировщика.
Вообще, в случае веб разработки на node, не так часто в основном потоке выполняются какие-то действительно сложные вычисления, наибольшие задержки приходятся на IO/операции с БД и другие асинхронные штуки. Остальные ваши сложные вычисления действительно сильно забивают основной поток? В этом случае да, лучше использовать workers, они в отдельном потоке запускаются.
Нагрузка большая, так же много бизнес логики на клиенте и сервере. Проблема в создании инстансов приложения, как и в создании воркеров внутри одного инстанса, в сложности точечно балансировать нагрузку при условии что все это куриться в kubernetes. Хотелось бы запускать новые инстансы только для загруженных операций. Например, если не хватает мощностей для ssr, запустить еще инстанс для ssr не переподнимая все приложения.
Но вообще, я склоняюсь к такому же решения. Еще подумаю о unix сокетах для обмена сообщениями. Спасибо за ответ.
tiwana6, есть результаты каких-то замеров? Сколько по времени выполняются операции именно в основном потоке? Не забывайте про асинхронность ноды, асинхронные операции освобождают основной поток для обработки других задач.
Мне все же кажется, вы несколько преувеличиваете проблему, и вам достаточно горизонтально масштабироваться, т.е. поднять несколько экземпляров ноды и балансировать нагрузку тем же kubernetes.
Проблемы в том, что ноды будут простаивать тоже не вижу, они же не особо тратят ресурсы во время простоя. А если они будут без нагрузки слишком часто - думаю это означает только то, что с вашей нагрузкой и одна нода справляется.