Сколько событий в очереди Node.js?

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

Как долго может быть эта очередь?

Ответ 1

Хотя это может показаться простым вопросом, на самом деле это довольно сложная проблема; к сожалению, нет простого номера, который кто-то может дать вам.

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

Второе: нет единой очереди. Есть много мест, где в JS можно отправлять события разного рода. (Ниже предполагается, что вы знаете, что такое галочка.)

  • Есть вещи, которые вы (или библиотеки, которые вы используете) передаете process.nextTick(). Они вызываются в конце текущего тика, пока очередь следующего тика не станет пустой.
  • Есть вещи, которые вы (или библиотеки, которые вы используете) передаете setImmediate(). Они вызываются в начале следующего тика. (Это означает, что задачи nextTick могут добавлять объекты в текущий тик на неопределенное время, предотвращая выполнение других операций, тогда как задачи setImmediate могут добавлять объекты в очередь только для следующего тика.)
  • События ввода/вывода обрабатываются libuv через epoll/kqueue/IOCP для Linux/Mac/Windows соответственно. Когда ОС уведомляет libuv о том, что произошел ввод/вывод, она, в свою очередь, вызывает соответствующий обработчик в JS. Данный тик цикла событий может обрабатывать ноль или более событий ввода/вывода; если тик занимает много времени, события ввода-вывода будут помещаться в очередь операционной системы.
  • Сигналы отправлены ОС.
  • Собственный код (C/C++), выполняемый в отдельном потоке, может вызывать функции JS. Обычно это достигается с помощью рабочей очереди libuv.

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

На практике ваше приложение будет:

  • Хит ограничения кучи V8
  • Для ввода/вывода максимально допустимое количество дескрипторов открытых файлов.

... задолго до того, как размер любой очереди станет проблематичным.

Если вас просто интересует, действительно ли ваше приложение находится под большой нагрузкой, toobusy может быть интересным - каждый тик цикла событий определяет, тратит ли ваше приложение необычное количество время обработки каждого тика (что может указывать на то, что ваши очереди задач очень велики).

Ответ 2

Обработчики для конкретного события называются синхронно (в том порядке, в котором они были добавлены), как только выдается событие, они не откладываются вообще.

Общее количество обработчиков событий ограничено только v8 и/или объемом доступной ОЗУ.

Ответ 3

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

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

С прослушивателями событий максимальное количество слушателей, которые вы можете получить, зависит от максимального размера массива вашей среды. В случае node.js движок javascript - v8, но согласно этому сообщению, максимальный уровень, установленный 5-м стандартом ECMA ~ 4 миллиарда элементов, который является пределом, которого вы никогда не должны преодолевать.

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

И это ограничения с каждым.