Это вторая часть серии ответов на знаменитый вопрос о знании узлов, взятых из book-node-beyond basics.
Первая часть находится здесь

6. В чем разница между setImmediate и process.nextTick?

NodeJs предлагает множество вариантов отложить выполнение кода на потом. Два из них, setImmediate и process.nextTick, похожи в том, что они ускоряют выполнение кода.

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

Таким образом, в случае, когда вы пытаетесь с помощью рекурсии разбить продолжительное задание, привязанное к ЦП, вы можете использовать `setImmediate`, а не process.nextTick для постановки в очередь следующей итерации, как в противном случае любой Обратные вызовы событий ввода-вывода не могли выполняться между итерациями.

7. Каковы существенные различия между spawn, exec и fork?

spawn, exec и fork — все три используются для создания дочерних процессов в NodeJs. Существенная разница между spawn и exec заключается в том, что функция spawn выполняет не создает оболочку для выполнения команды, которую мы передаем в нее, тогда как exec, в свою очередь, делает последнюю менее эффективной по сравнению с предыдущей. Функция exec имеет еще одно существенное отличие. Он буферизует сгенерированный вывод команды и передает все выходное значение функции обратного вызова вместо использования потоков, как это делает spawn.

fork, с другой стороны, по сравнению с spawn и exec создает канал связи с дочерним процессом, поэтому мы можем использовать функцию отправки в разветвленном процессе вместе с самим объектом глобального процесса для обмена сообщениями между родительские и разветвленные процессы.

8. Как работает модуль кластера? Чем это отличается от использования балансировщика нагрузки?

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

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

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

9. Что будет делать Node, когда и стек вызовов, и очередь цикла событий пусты?

Если и стек вызовов, и цикл событий пусты и не осталось фоновых/асинхронных задач, которые можно добавить в очередь, то есть источников событий больше нет, Node завершит работу.

10. Что такое шаблоны объектов и функций V8?

ObjectTemplate дает нам объекты JS без специальной функции-конструктора и прототипа. Они используют Object[.prototype]. Поскольку мы по-прежнему можем прикреплять обработчики свойств, они могут быть полезны, тогда как FunctionTemplates дает нам дополнительное преимущество, поскольку они предоставляют нам функцию-конструктор для использования.

11. Как мы можем выполнить последнюю операцию перед завершением процесса Node? Можно ли выполнить эту операцию асинхронно?

Для выполнения последней операции до того, как будет создан процесс Node, мы можем зарегистрировать обработчик для process.on('exit') или можем использовать SIGINT или SIGTERM

Нижеприведенная суть объясняет различные методы для одного и того же:

// only works when there is no task running
// because we have a server always listening port, this handler will NEVER execute
process.on(“beforeExit”, (code) => {
console.log(“Process beforeExit event with code: “, code);
});
// only works when the process normally exits
// on windows, ctrl-c will not trigger this handler (it is unnormal)
// unless you listen on ‘SIGINT’
process.on(“exit”, (code) => {
console.log(“Process exit event with code: “, code);
});
// just in case some user like using “kill”
process.on(“SIGTERM”, (signal) => {
console.log(`Process ${process.pid} received a SIGTERM signal`);
process.exit(0);
});
// catch ctrl-c, so that event ‘exit’ always works
process.on(“SIGINT”, (signal) => {
console.log(`Process ${process.pid} has been interrupted`);
process.exit(0);
});
// what about errors
// try remove/comment this handler, ‘exit’ event still works
process.on(“uncaughtException”, (err) => {
console.log(`Uncaught Exception: ${err.message}`);
process.exit(1);
});

12. Помимо V8 и libuv, какие еще внешние зависимости есть у Node?

Ниже перечислены все отдельные библиотеки, которые может использовать процесс Node:

  • http-парсер
  • с-арес
  • OpenSSL
  • zlib

Все они являются внешними по отношению к Node. У них есть собственный исходный код. У них тоже есть своя лицензия. Node просто использует их.