Очередь сообщений поможет вам стать высокооплачиваемым инженером Node.js

Node.js внешний интерфейс JavaScript
Очередь сообщений поможет вам стать высокооплачиваемым инженером Node.js

зачем писать эту статью

  • Теперь требования к собеседованиям становятся все выше и выше. Я открыл и посмотрел несколько BOSS, набирающих разработчиков полного стека Node.js. Среди них есть сообщение «Понимание очереди сообщений и применение ее в проекте», у-у-у-у.
  • Бэкенд-разработчики должны все знать об очередях сообщений, но некоторые фронтенд-разработчики могут знать немногое, но вам может быть любопытно抢票,商品秒杀Как такие функции реализованы, на самом деле не очень, это можно узнать прочитав очередь сообщений.

Карта статьи (можно узнать)

Об авторе: koala, сосредоточив внимание на совместном использовании полного стека технологий Node.js, от JavaScript до Node.js, до серверной базы данных, я желаю вам стать отличным старшим инженером Node.js. [Руководство по развитию программиста] Автор, блог Github с открытым исходным кодомGitHub.com/koala-co Nth…

Что такое очередь сообщений

«Очередь сообщений» — это контейнер, в котором хранятся сообщения во время их передачи.

личное понимание: Я разделил это на два слова消息а также队列. Когда большое количество клиентов генерируют большое количество сетевых запросов одновременно (消息), определенно есть ограничение на мощность сервера. В это время, если есть контейнер, было бы хорошо сначала поставить эти сообщения в очередь.К счастью, есть вызов队列структура данных, через有队列属性的容器Постановка в очередь (первым пришел, первым вышел), а затем отправка сообщения на наш сервер, давление значительно снижается, это здорово容器очередь сообщений

Это понимание также содержит эти два понятия: клиент->生产者сервер ->消费者когда есть消息队列появляться,生产者а также消费者являются двумя важными понятиями, приведенное выше понимание多个生产者вести переписку一个消费者, конечно, в реальной разработке есть许多消费者ситуация о. В последующих статьях также будет ссылка на生产-消费模型.

Преимущества очереди сообщений

  • Разделение приложений

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

  • Гибкость и максимальная управляемость

    Когда количество посещений клиентов внезапно резко возрастает, доступ к серверу превышает максимальное пиковое значение, которое может обработать служба, и даже приводит к сбою сервера с течением времени.Эта проблема может быть решена с помощью очередей сообщений.控制消费者的处理速度а также生产者可进入消息队列的数量и т. д., чтобы избежать пиковых проблем

  • гарантия заказа

    Очередь сообщений может управлять порядком обработки данных, поскольку сама очередь сообщений использует структуру данных очереди,FIFO(Расширенный выбор), порядок обработки данных очень важен в некоторых сценариях, таких как порядок заказов товаров.

  • Асинхронная связь

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

  • Масштабируемость

    Как упоминалось ранее, очереди сообщений могут解耦, если мы хотим увеличить частоту обработки сообщений в очереди и из очереди, это очень просто, и нам не нужно ничего менять в коде.Мы можем напрямую изменить некоторые конфигурации очереди сообщений.Например, мы хотим ограничить сообщения, отправляемые потребителям каждый раз, когда количество баров и т. д.

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

Введение в типы очередей сообщений

Вывести на рынок несколько основных очередей сообщений (внеклассные знания можно игнорировать)

  • Kafka: это платформа обработки потоков с открытым исходным кодом, разработанная Apache Software Foundation, написанная на Scala и Java.Это высокопроизводительная распределенная система обмена сообщениями типа «публикация-подписка», поддерживающая миллионы параллелизма в секунду на одной машине. Кроме того, Kafka позиционируется в основном с точки зрения журналов и т. д., потому что первоначальный замысел дизайна Kafka состоит в том, чтобы处理日志, можно рассматривать как日志(消息)系统Важный компонент, узконаправленный. Версия 0.8 стала поддерживать репликацию, но не транзакции, поэтому жестких требований к дублированию, потере и ошибкам сообщений нет.
  • RocketMQ: Промежуточное ПО для сообщений с открытым исходным кодом от Alibaba — это высоконадежное, масштабируемое и простое в использовании промежуточное ПО для сообщений с малой задержкой.Идея исходит от Кафки. Самая большая проблема в том, что коммерческая версия платная, а некоторые функции не открыты.
  • RabbitMQ: система очереди сообщений с открытым исходным кодом, основанная на протоколе AMQP, разработанном Erlang (с такой же низкой задержкой, как и собственный Socket). Он может обеспечить надежность, стабильность и безопасность сообщения.高并发

Нет сомнений, что RabbitMQ является самым высоким, потому что его язык реализации — это язык erlang с высоким параллелизмом и высокой доступностью.分布式Преимущество.

иллюстрировать:В этой статье в основном объясняется RabbitMQ, который встречается чаще. Лично я думаю, что функции, которые могут выполняться промежуточным программным обеспечением для очередей сообщений, также могут быть достигнуты с помощью Redis, мышления.

Первый взгляд на очереди сообщений (простое применение очередей сообщений в node.js)

Базовая установка Rabbitmq

Установка версии для Mac

Чтобы установить напрямую через HomeBrew, выполните следующую команду

brew install rabbitmq

запустить кролика

进入安装目录
$ /usr/local/Cellar/rabbitmq/3.7.8
启动
$ sbin/rabbitmq-server

ввод в браузереhttp://localhost:15672/#/Имя пользователя и пароль по умолчанию гость

Основная схема после установки

Введение функции модуля визуального интерфейса:


Для другой установки системы, пожалуйста, выполните поиск в Интернете самостоятельно

Разница между несколькими портами

5672: номер порта по умолчанию для связи 15672: номер порта по умолчанию для консоли администратора. 25672: номер порта связи кластера. Примечание. Если установка RabbitMQ выполнена успешно на сервере Alibaba Cloud ECS, доступ к внешней сети будет невозможен, так как группа безопасности не имеет открытых портов.

Основные команды после установки Rabbitmq

Ниже перечислены некоторые часто используемые команды операций в терминале.

  • whereis rabbitmq: просмотр места установки rabbitmq
  • rabbitmqctl start_app: запустить приложение
  • whereis erlang: Посмотреть место установки erlang
  • rabbitmqctl start_app: запустить приложение
  • rabbitmqctl stop_app: закрыть приложение
  • Статус rabbitmqctl: статус узла
  • rabbitmqctl add_user имя пользователя пароль: добавить пользователя
  • rabbitmqctl list_users: список всех пользователей
  • rabbitmqctl delete_user имя пользователя: удалить пользователя
  • rabbitmqctl add_vhost vhostpath: создать виртуальный хост
  • rabbitmqctl list_vhosts: список всех виртуальных хостов
  • rabbitmqctl list_queues: просмотреть все очереди
  • rabbitmqctl -p vhostpath purge_queue синий: очистить сообщения в очереди

Уведомление: Для всех вышеперечисленных команд терминала вам необходимо войти в каталог sbin rabbitmqctl, чтобы выполнить команду rabbitmqctl, чтобы она была полезной, иначе будет сообщено об ошибке:

Node.js реализует простую очередь сообщений HelloWorld.

Нарисуйте базовое изображение, изображение очереди сообщений HelloWorld, и внесите в него следующие концепции.


Прежде чем рассматривать этот код, давайте поговорим о нескольких концепциях.

  • Производитель: Тот, кто производит сообщение
  • Потребитель: получатель сообщения
  • Канал канала: после установления соединения будет получен канал канала
  • exchange : Обмен, сообщение должно быть сначала отправлено на обмен, который также можно назвать первым местом для хранения сообщения (существует много типов обменов, которые будут подробно описаны позже).
  • Очередь сообщений: место, где сообщение хранится непосредственно перед тем, как оно достигнет потребителя, и биржа обмена доставит сообщение в это место.
  • подтверждение подтверждения: подтверждение того, что сообщение было использовано после получения сообщения.

модуль amqplib

Порекомендуйте модуль npmamqplib.

Github: GitHub.com/squaremembrane/аминь…

$ npm install amqplib

Код производителя product.js

const amqp =require('amqplib');

async function  product(params) {
    // 1.创建链接对象
    const connect =await amqp.connect('amqp://localhost:5672');
     // 1. 创建链接对象
     const connection = await amqp.connect('amqp://localhost:5672');

     // 2. 获取通道
     const channel = await connection.createChannel();
 
     // 3. 声明参数
     const routingKey = 'helloKoalaQueue';
     const msg = 'hello koala';
 
     for (let i=0; i<10000; i++) {
         // 4. 发送消息
         await channel.publish('', routingKey, Buffer.from(`${msg} 第${i}条消息`));
     }
 
     // 5. 关闭通道
     await channel.close();
     // 6. 关闭连接
     await connect.close();
}
product();

Интерпретация кода производителя и результаты выполнения

执行 node product.js

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

  • Вопрос 1

    Термин «переключатель» упоминался ранее.生产者При отправке сообщения необходимо указать обмен. Если не указать обмен (пусто), он по умолчанию будет указывать на обмен по умолчанию AMQP. Правило маршрутизации по умолчанию AMQP сопоставляет маршрутизацию на основе routingKey и наличия очередей с такое же имя на mq. Приведенный выше код является переключателем по умолчанию. Подробное описание различных типов переключателей см. ниже.

  • вопрос 2

    После отправки сообщения производителем сообщение отправляется на биржу, но будет ли в это время создаваться очередь?

    Ответ: В коде мы объявляем, что маршрут является routingKey, но он не создает очередь сообщений helloKoalaQueue, и сообщение будет отправлено только на биржу обмена. Скриншот очереди после запуска кода демонстрирует это:

  • Описание 1

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

  • Инструкция 2

    Может выполняться несколько разnode product.jsКод производителя, сообщения будут накапливаться до交换机exchange, он не будет перезаписан, если потребитель был выполнен и соответствующий消息队列, сообщение начнется сexchange交换机Отправить消息队列, и хранится в消息队列,ждать消费者Потребление

Потребительский код Consumer.js

// 构建消费者
const amqp = require('amqplib');

async function consumer() {
    // 1. 创建链接对象
    const connection = await amqp.connect('amqp://localhost:5672');

    // 2. 获取通道
    const channel = await connection.createChannel();

    // 3. 声明参数
    const queueName = 'helloKoalaQueue';
  
    // 4. 声明队列,交换机默认为 AMQP default
    await channel.assertQueue(queueName);

    // 5. 消费
    await channel.consume(queueName, msg => {
        console.log('Consumer:', msg.content.toString());
        channel.ack(msg);
    });
}
consumer();

Интерпретация кода производителя и результаты выполнения

执行 node consumer.js
  • Результат выполнения после запуска

  • Описание 1

    В это время я изменил имя очереди в коде наhelloKoalaQueueHaHa, В это время посмотрите на визуальный интерфейс Rabbitmq, модуль очереди и создайте эту очередь

    Увидев это снова, вы доказываете, что очередь сообщений превосходна.解耦特性,消费者和生产者模型Между ними нет связи, создайте это сноваhelloKoalaQueueHaHaпроизводитель имени маршрута,消费者Он также будет потребляться в обычном режиме, и будет напечатано сообщение, так что вы можете попробовать его.

  • Инструкция 2

    В это время я изменил имя очереди в коде наhelloKoalaQueueHaHa, В это время посмотрите на визуальный интерфейс Rabbitmq, модуль очереди и создайте эту очередь

    Увидев это снова, вы доказываете, что очередь сообщений превосходна.解耦特性,消费者和生产者模型Между ними нет связи, создайте это сноваhelloKoalaQueueHaHaпроизводитель имени маршрута,消费者Он также будет потребляться в обычном режиме, и будет напечатано сообщение, так что вы можете попробовать его.

Как освободить очередь сообщений

Удалить очередь сообщений прямо в визуальном интерфейсе

  1. Посетите http://{IP-адрес установки Rabbitmq}:15672 и войдите в систему.
  2. Нажмите на очереди, здесь вы можете увидеть все очереди, которые вы создали,
  3. Выберите очередь, а затем войдите в интерфейс списка, внизу есть кнопка «Удалить», подтвердите удаление очереди/очистить сообщение очереди, чтобы очистить сообщение.

Недостатки:Таким образом можно удалить только одну очередь и одну очередь.Если в очереди слишком много сообщений, это будет особенно медленно.

Реализовать освобождение (удаление) очереди сообщений с помощью кода

Объяснение обмена очередями сообщений

Запомни одно предложение

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

Затем начните объяснение переключателя в этой главе.

Если exchange не указан (пусто), он по умолчанию будет указывать на обмен AMQP по умолчанию.Правило маршрутизации AMQP по умолчанию соответствует маршрутизации на основе routingKey и наличия очередей с таким же именем на mq.

Тип переключателя

Четыре часто используемых типа

  • fanout

  • direct

  • topic

  • headers

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

разветвление (трансляция китайского перевода)

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

На приведенном выше рисунке все сообщения, отправленные производителем (Producter) в Exchange (X), будут направляться в две очереди на рисунке и в конечном итоге потребляться двумя потребителями (consumer1 и Consumer2).

Объяснение: Все сообщения будут направляться в две очереди. Могут ли оба получателя получать одни и те же сообщения? Ответ: да, сообщения очереди, получаемые двумя потребителями, обычно должны быть одинаковыми. Этот тип часто используется для требований широковещательного типа, или он также может записывать журналы для потребителя 1 и печатать журналы для потребителя 2.

Соответствующая реализация кода:

Режиссер:

const amqp = require('amqplib');

async function producer() {
    // 创建链接对象
    const connection = await amqp.connect('amqp://localhost:5672');

    // 获取通道
    const channel = await connection.createChannel();

    // 声明参数
    const exchangeName = 'fanout_koala_exchange';
    const routingKey = '';
    const msg = 'hello koala';

    // 交换机
    await channel.assertExchange(exchangeName, 'fanout', {
        durable: true,
    });

    // 发送消息
    await channel.publish(exchangeName, routingKey, Buffer.from(msg));

    // 关闭链接
    await channel.close();
    await connection.close();
}
producer();

потребитель:

const amqp = require('amqplib');

async function consumer() {
    // 创建链接对象
    const connection = await amqp.connect('amqp://localhost:5672');

    // 获取通道
    const channel = await connection.createChannel();

    // 声明参数
    const exchangeName = 'fanout_koala_exchange';
    const queueName = 'fanout_kaola_queue';
    const routingKey = '';

    // 声明一个交换机
    await channel.assertExchange(exchangeName, 'fanout', { durable: true });

    // 声明一个队列
    await channel.assertQueue(queueName);

    // 绑定关系(队列、交换机、路由键)
    await channel.bindQueue(queueName, exchangeName, routingKey);

    // 消费
    await channel.consume(queueName, msg => {
        console.log('Consumer:', msg.content.toString());
        channel.ack(msg);
    });

    console.log('消费端启动成功!');
}
consumer();

Примечание: другие типы кодов выложены на github, адрес:GitHub.com/koala-co Nth…Добро пожаловатьstarобщаться с.

direct

прямые сообщения перенаправляются в очереди, ключ привязки которых точно соответствует ключу маршрутизации.

Конфигурация на рисунке выше является примером: мы отправляем сообщение на Exchange с routingKey="error", и сообщение будет перенаправлено на amq1 и amq2; если мы отправим сообщение с routingKey="info" или routingKey="warning », сообщение будет отправлено только Route to Queue2. Если мы отправим сообщение с другим ключом маршрутизации, сообщение не будет перенаправлено в эти две очереди.

topic

Указанное производителем сообщение RoutingKey пересылается путем нечеткого сопоставления в соответствии с очередью, указанной потребителем.Существует два режима подстановочных знаков: #: может соответствовать одному или нескольким ключевым словам *: может соответствовать только одному ключевому слову

headers

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

Обдумывание и углубленное изучение очередей сообщений

реализация очереди сообщений rpc

(Содержимое данного подраздела взято из Интернета, см. описание статьи)

Метод сервера удаленных вызовов RPC с использованием MQ может реализовать асинхронный вызов RPC на основе прямого коммутатора.

  1. Клиент одновременно является производителем и потребителем, отправляя сообщения вызова RPC в очередь запросов RPC и одновременно прослушивая очередь ответов RPC.
  2. Сервер прослушивает очередь запросов RPC и выполняет метод сервера после получения сообщения.
  3. Сервер отправляет результат выполнения метода в очередь ответов RPC

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

Здесьсохранение сообщениянеобходимо?

消息队列Он сохраняется в памяти, в случае возникновения проблемы и зависания сообщения в очереди сообщений будут потеряны. Поэтому очень важно, чтобы некоторые требования были постоянными! RabbitMQ может включить постоянство. Параметры персистентности можно задавать на разных языках разработки.

Вот Node.js как пример, другие языки могут искать сами

    await channel.assertExchange(exchangeName, 'direct', { durable: true });
    // 注意其中的{ durable: true },这事对交换机持久化,还有其他的几种持久化方式

Также порекомендуйте хорошую статью о написании настойчивости:nuggets.capable/post/684490…

Есть ли у потребителясообщение ответнеобходимо?

Простое объяснение ответа на сообщение消费者После завершения потребления уведомить очередь сообщений.

Я думаю, что эта конфигурация необходима для открытия, потребитель выполняет задачу в очереди сообщений, потребитель может выйти из строя или зависнуть в середине, как только RabbitMQ отправляет сообщение потребителю, а затем быстро отправляет сообщение из消息队列内存В этом случае после сбоя или зависания соответствующего рабочего процесса потребителя сообщения, обрабатываемые процессом, также будут потеряны. Кроме того, все необработанные сообщения, отправленные процессу, будут потеряны.

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

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

Ответ на сообщение отключен по умолчанию. Пришло время использовать параметр false (элемент конфигурации auto-ack), чтобы включить его.

Вот Node.js как пример, другие языки могут искать сами

// 消费者消费时候的代码
await channel.consume(queueName, msg => {
    console.log('koala:', msg.content.toString());
    //... 这里可以放业务逻辑处理的代码,消费者完成后发送回执应答
    channel.ack(msg);// 消息应答
}, { noAck: false });

Как добиться справедливого планирования?

могуprefetch countЗначение элемента настроено на 1, что указывает RabbitMQ не отправлять более одного сообщения каждому потребителю одновременно. Другими словами, этому потребителю ничего не будет отправлено, пока сообщение не будет обработано и подтверждено. Вместо этого он отправит сообщение следующему бездействующему потребителю или рабочему процессу.

Возьмем Node.js в качестве примера, предварительная выборка метода интерфейса, предоставляемая библиотекой amqplib для текущей реализации ограничения.

описание параметра предварительной выборки:

  • count: Количество сообщений, отправляемых потребителю каждый раз N. Если сообщения N не подтверждены, производитель не будет отправлять их снова, пока сообщения N не будут использованы.
  • global: какой уровень ограничить, ture — это ограничение на канал, false — это ограничение на стороне потребителя, по умолчанию — false.
// 创建消费者的时候 限流参数设置
await channel.prefetch(1, false);

Как реализовать переключатель для отправки сообщений нескольким потребителям по очереди, выберите какой переключатель?

Если один производитель и два потребителя отправляют сообщения, очередь, которую я хочу, будет отправлена ​​сначала потребителю 1, а затем потребитель 1 отправит потребителю 2 после отправки сообщений, так что существует последовательность интерактивной отправки, какой переключатель должен быть сейчас? Внимание — это взаимодействие, подумайте об этом после прочтения? Кроме того, необходимо ли вручную вызывать завершение очереди сообщений после завершения работы потребителя? Нужно ли сохранять сообщения и каковы преимущества сохранения?

(После прочтения доставки сообщений очереди сообщений у вас возникнут вопросы о том, как сообщения (производители) в конвейере потребляются потребителями, помещаются в очередь, а затем вынимаются из очереди)

Сценарий приложения очереди сообщений

  1. Реализована функция «Двойной 11 товарный всплеск / захват билетов»

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

    Используйте рисунок, чтобы объяснить использование очередей сообщений в таких сценариях, как seckill и захват билетов:(Примечание: прежде чем смотреть вниз, если у вас были всплески электронной коммерции, вы можете подумать о том, как вы этого добились, и мы можем обсудить это вместе. Здесь я просто хочу поговорить о роли очередей сообщений, а не об окончательных результатах оптимизации. , например Управление общим кешем с помощью Redis и т. д.)

    Здесь при формировании заказа нет необходимости напрямую оперировать БД IO и удерживать инвентарь. Сначала вычитается инвентарь, чтобы убедиться, что он не перепродан, а затем асинхронно генерируется пользовательский заказ, который используется один раз в режиме реального времени.消费队列, чтобы скорость ответа пользователю была намного выше, к тому же необходимо обеспечить много продаж, а если пользователь получит заказ и не оплатит? Мы все знаем, что у ордеров сейчас есть срок годности, используйте другой消息队列, используется для оценки сверхурочной оплаты заказа. Например, если пользователь не заплатит в течение пяти минут, заказ будет недействителен. Если заказ недействителен, будет добавлен новый инвентарь. Это также решение, принятое многими розничными онлайн-компаниями для обеспечения продажи многих продуктов. Когда объем заказа относительно невелик, генерация заказа происходит очень быстро, и пользователям практически не приходится стоять в очереди.

  2. Обмен баллов (баллы можно использовать на нескольких платформах)

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

  3. Отправка электронных писем, анализ больших данных пользователей и т. д. Синхронная реализация асинхронной функции

    Об этой функции можно сказать больше, начиная с регистрации пользователя на платформе.

    • Регистрация пользователя
    • Пользователь регистрируется и выбирает несколько тегов интересов.В это время необходимо рассчитать рекомендуемый контент в соответствии с атрибутами пользователя и анализом пользователя.
    • Может потребоваться отправить электронное письмо пользователю после регистрации.
    • Отправить системное уведомление пользователю с практическими руководствами
    • и т.д

    Зарегистрируйтесь в нормальных условиях без высокого параллелизма:

    Для пользователя он просто хочет зарегистрироваться и использовать это программное обеспечение.Пока сервер сохраняет информацию о его учетной записи в базе данных, он может войти в систему и делать то, что он хочет. Пользователя эти вещи не волнуют, сервер может поместить другие операции в соответствующие消息队列а затем немедленно вернуть пользовательский результат по очереди сообщений异步для выполнения этих операций.

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

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

  4. Node.js на основе RabbitMQ взаимодействует с Phython или другими языками.

    Здесь также используется функция decoupling RabbitMQ, которая может общаться не только с Phython, но и со многими другими языками, поэтому не буду вдаваться в подробности.

Суммировать

Детка, не просто смотри, попробуй! Очень интересно напрямую открыть сервис и установить RabbitMQ, даже HelloWorld может попробовать много контента. И многое из содержимого этой статьи можно реализовать с помощью Redis, вы также можете прочитать мою статью о Redis. Кстати, Design Patterns и Data Structures — две хорошие вещи, которые ощущаются все больше и больше.

Справочная статья

Блог Woohoo.cn на.com/Bai Dawei/Afraid/…

woohoo.so JSON.com/blog/48.htm…

Ууху. Call.com/question/34…

Не совсем. CSDN.net/topics/3921…

Вухуу. ИМО OC.com/article/293…

Tickets.WeChat.QQ.com/Yes/Ask TK WJ XL NR…

Оригинальные статьи серии Node

Глубокое понимание процессов и потоков в Node.js

Если вы хотите изучить Node.js, сначала необходимо понять поток.

Когда требуется, вы действительно понимаете разницу между экспортом и модулем.экспорт?

В статье об интерпретации исходного кода подробно рассматривается модуль Events.

Node.js расширенное расширенное изучение файлового модуля fs

Подписывайтесь на меня

  • Добро пожаловать, чтобы добавить меня в WeChat (coder_qi), привлечь вас в техническую группу, долгосрочный обмен и изучение...
  • Добро пожаловать, чтобы обратить внимание на «Руководство по развитию программиста на севере», общедоступную учетную запись, которая поможет вам расти с душой...