Node.js : узкие места при регистрации очень большого количества слушателей и обратных вызовов?

#javascript #node.js #events #callback #cluster-computing

#javascript #node.js #Мероприятия #обратный вызов #кластерные вычисления

Вопрос:

Я работаю над приложением, в котором один сервер может получать до 100 000 запросов на результаты одного и того же медленно выполняемого (до 5 секунд) процесса. Это означает EventEmitter , что с большой загрузкой слушателей и обратных вызовов все они будут запущены одновременно. На какие вещи мне нужно обратить внимание здесь — является ли нехватка памяти проблемой?

Дополнительные детали реализации, если это уместно: собираетесь использовать кластер с memcached для кэширования результатов и для блокировки (потому что только один обработчик запроса должен работать с каждым уникальным запросом одновременно, в то время как остальные 99 999 ожидают его завершения), с межпроцессным взаимодействием между разветвлениями длязапускает необходимые события по всему кластеру. Таким образом, на самом деле мы, вероятно, получим 4 узловых процесса, каждый из которых содержит 25 000 слушателей, ожидающих какого-либо распределенного события.

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

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

Комментарии:

1. Раньше EventEmitter был ограничен 10 событиями на имя, поэтому я думаю, что вы можете немного растянуть его здесь. ( github.com/joyent/node/blob /… ) если события не повторяются, я не вижу необходимости в eventemitter; это большие накладные расходы для инструментов, которые вам не нужны.

2. Вы правы, хотя предел может быть установлен в 0 для неограниченного. Не уверен, как еще это сделать. Этот сервер может получать много тысяч запросов в секунду для чего-то, что нужно вычислить только один раз, но для вычисления которого требуется несколько секунд (это включает HTTP-запросы), поэтому где -то должны быть зарегистрированы тысячи обратных вызовов. Не могли бы вы предложить другой способ их регистрации?