Что такое MessagePort и BroadcastChannel?nodejs-14

MessagePort

MessagePort - это часть API worker_threads в Node.js, который позволяет организовать межпоточное взаимодействие (между Worker'ами). Это дуплексный канал связи, который можно использовать для передачи сообщений между потоками.

Основные характеристики:

  • Создается вместе с Worker или через new MessageChannel()
  • Позволяет отправлять и получать сообщения
  • Поддерживает передачу структурных клонов (structured clone algorithm)
  • Может передавать экземпляры MessagePort (техника называется "transferring")

Пример использования:

const { Worker, MessageChannel } = require('worker_threads');

const { port1, port2 } = new MessageChannel();

// Worker 1
const worker = new Worker(`
  const { parentPort, MessagePort } = require('worker_threads');
  parentPort.on('message', (message) => {
    message.port.postMessage('Hello from worker!');
  });
`);

// Main thread
worker.postMessage({ port: port1 }, [port1]);
port2.on('message', (msg) => {
  console.log(msg); // 'Hello from worker!'
});

BroadcastChannel

BroadcastChannel - это API, доступное как в браузере, так и в Node.js (с версии 15.4.0), которое позволяет осуществлять широковещательную рассылку сообщений между различными контекстами (вкладками, worker'ами, процессами).

Основные характеристики:

  • Одноименные каналы автоматически соединяются
  • Сообщения доставляются всем слушателям канала
  • Не требует явного создания пар портов
  • Работает в рамках одного источника (origin) в браузере

Пример использования:

const { BroadcastChannel } = require('worker_threads');

// Worker 1
const bc1 = new BroadcastChannel('my_channel');
bc1.postMessage('Hello everyone!');

// Worker 2
const bc2 = new BroadcastChannel('my_channel');
bc2.onmessage = (event) => {
  console.log(event.data); // 'Hello everyone!'
};

Сравнение

Характеристика MessagePort BroadcastChannel
НаправленностьТочечное соединениеШироковещательный
СложностьТребует настройкиПростое подключение
Передача портовПоддерживаетсяНе поддерживается
ПроизводительностьВыше (прямое соединение)Ниже (широковещание)

Резюмируем

  1. MessagePort - для прямого обмена сообщениями между двумя конкретными потоками с возможностью передачи самого порта.
  2. BroadcastChannel - для широковещательной рассылки сообщений всем подписчикам канала.
  3. Выбор между ними зависит от архитектуры приложения: нужна ли точечная связь или массовая рассылка.

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