Рубрики
Без рубрики

Обработка очереди сообщений в Node.js с AWS SQS

AWS SQS позволяет нам отделить большие системы, предоставляя им свободно связанный механизм связи. В этой статье мы будем использовать Node.js и AWS SQS для создания системы обмена сообщениями, идеально подходящие для микросервисов.

Автор оригинала: Robley Gori.

Вступление

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

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

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

В этом посте мы будем нырять в системы массовой информации, особенно Amazon’s Простая служба очереди И продемонстрировать, как мы можем использовать свои особенности в среде микровиссов.

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

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

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

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

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

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

Вот несколько примеров популярных очередей сообщений или брокеров:

  • Amazon Simple Overeue Service – который является центром этой статьи
  • Rabbitmq – который является открытым источником и обеспечивает асинхронные возможности обмена сообщениями
  • Apache Kafka – который является распределенной потоковой платформой, которая поддерживает режим взаимодействия PUB/Sub/Sub
  • Другие включают Apache Rocketmq , NSQ и Hornetq.

Использование случаев очереди сообщений

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

Во-первых, очереди сообщений поддерживают развязку крупных систем, обеспечивая механизм связи в свободной связанной системе.

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

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

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

Amazon Simple Queue Service – SQS

Как и большинство других предложений из Amazon Web Services, простая служба очередей (SQS) – это решение для очереди сообщений, которое распространяется и полностью управляется Amazon, очень похожим на немозговые вычисления через Чаша Отказ

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

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

Демо-проект

Исследовать Amazon Simple Overeue Service , мы создадим развязанную систему в Node.js, которые каждый компонент будет взаимодействовать с другими, отправив и извлекивая сообщения от SQS.

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

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

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

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

Amazon Web Services.

Для этого проекта нам понадобится активная и действительная учетная запись AWS, которую мы можем зарегистрироваться на Домашняя страница AWS Отказ AWS требует, чтобы мы не только предложили некоторые личные данные, но и наши детали платежей. Чтобы избежать выставления счета за этот демонстрационный проект, мы будем использовать AWS Free Wier для целей тестирования и развития.

Нам также нужно будет установить инструмент AWS CLI, чтобы взаимодействовать с нашими ресурсами AWS с наших машин. Инструкции по установке инструмента AWS CLI на нескольких платформах можно найти здесь Отказ

С помощью инструмента AWS CLI на месте мы можем отправиться в AWS Console И под выпадом нашего профиля есть раздел под названием « мои учетные данные о безопасности ». Здесь мы сможем создавать учетные данные, которые будут использоваться при взаимодействии с консолью AWS.

Эти учетные данные также будут использоваться инструментом Amazon CLI, который мы настроим бегом:

$ aws configure

Мы получим подсказку на нашу Доступ к ключу ID , Секретный ключ доступа и регионы по умолчанию и форматы вывода. Последние два необязательны, но нам понадобится ключ доступа и секрет, который мы получили из приборной панели консоли AWS.

С нашей учетной записью AWS UP и работает, а CLI AWS CLI настроил, мы можем настроить нашу простую службу очередей AWS, навигацию на Домашняя страница SQS Отказ

Как мы можем видеть на следующем скриншоте, после указания нашего имени очереди AS Nodeshop.fifo Нам представлены двумя вариантами очереди:

SQS инициализация

У нас есть возможность выбрать между A Стандартная очередь или ФИФО Очередь Отказ Стандартная очередь не поддерживает порядок сообщений, которые он получает, и лучше подходит для проектов, приоритетных приоритетных пропускной способности за порядком событий.

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

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

SQS FIFO Advanced Config

Мы можем настроить время до того, как сообщение автоматически удаляется из очереди и размером сообщения, среди других вариантов. На данный момент мы настроим нашу очередь FIFO, используя значения по умолчанию. С нашей очередью готов, теперь мы можем создать наши apis adoode.js, которые будут читать и написать нашей очереди Amazon SQS FIFO.

Настройка Node.js и NPM

Инструкция для настройки Node.js на нескольких платформах можно найти здесь на Node.js Официальный сайт Отказ Узел узел пакета (NPM) поставляется с Node.js, и мы можем проверить нашу установку следующим образом:

# Node.js version
$ node -v
v12.12.0

# NPM version
$ npm -v
6.11.3

Следующим шагом является настройка наших папок следующим образом:

# create folder and move into it
$ mkdir nodeshop_apis && cd $_

# create the orders and emails services folders
$ mkdir orderssvc emailssvc

Настройка API узла

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

Мы инициализируем проект Node.js и установите Express.js framework , который мы будем использовать для создания нашего минималистского API. Мы также установим Тело-парсер промежуточное программное обеспечение для обработки данных нашей запроса для нас и также подтверждают его.

Для достижения этого в нашей корневой папке:

# initialize node project
$ npm init

# install express and body-parser
$ npm install express body-parser --save

Когда-то экспресс и Тело-парсер Устанавливаются, они будут автоматически добавлены в раздел зависимости нашего Package.json Файл благодаря --save вариант.

Поскольку у нас будет несколько услуг, которые будут работать одновременно, мы также установим NPM-Run-all Пакет, чтобы помочь нам запускать все наши услуги одновременно и не приходится запускать команды в нескольких оконечных окнах:

$ npm install npm-run-all --save

С NPM-Run-all Установлен, давайте теперь настроим Сценарии Вход в нашу Package.json Файл Чтобы включить команды для запуска наших служб и одну команду для запуска их всех:

{
  // Truncated for brevity...
  "scripts": {
    "start-orders-svc": "node ./orderssvc/index.js 8081",
    "start-emails-svc": "node ./emailssvc/index.js",
    "start": "npm-run-all -p -r start-orders-svc"
  },
  // ...
}

Мы добавим команды start-orders-svc и Start-Eails-SVC Чтобы запустить наши заказы и Письма Услуги соответственно. Затем мы настроим Начать Команда для выполнения их оба использования NPM-Run-all Отказ

С помощью этой настройки выполнение всех наших услуг будет максимально простым, как выполнение следующей команды:

$ npm start

Мы можем создать наши заказы API в index.js Файл следующим образом:

const express = require('express');
const bodyParser = require('body-parser');

const port = process.argv.slice(2)[0];
const app = express();

app.use(bodyParser.json());

app.get('/index', (req, res) => {
    res.send("Welcome to NodeShop Orders.")
});

console.log(`Orders service listening on port ${port}`);
app.listen(port);

После добавления необходимых библиотек к нашему Express приложение Конечная точка «/index» ответит просто отправлять приветственное сообщение. Наконец, API будет слушать порт, который мы укажем при запуске.

Мы начнем приложение, запустив NPM начать Команда и взаимодействовать с нашими API, используя Приложение Postman :

Postman Получить запрос

Мы будем реализовать Письма Сервис позже. На наше заказы Служба установлена, и теперь мы можем реализовать нашу бизнес-логику.

Реализация: обслуживание заказов

Для реализации нашей бизнес-логики мы начнем с заказы Служба, которая получит наши заказы и напиши их на нашей очереди Amazon SQS.

Мы достигнем этого, введя новый маршрут и контроллер, чтобы обрабатывать ввод заказа с конечного пользователя и отправлять данные заказа на нашу очередь Amazon SQS.

Перед внедрением контроллера нам нужно будет установить Amazon SDK для Node.js:

$ npm install aws-sdk --save

Наш новый «/order» конечная точка получит полезную нагрузку, которая содержит данные заказа и отправить его в нашу очередь SQS с помощью AWS SDK:

// ./orderssvc/index.js

//
// Code removed for brevity...
//

// Import the AWS SDK
const AWS = require('aws-sdk');

// Configure the region
AWS.config.update({region: 'us-east-1'});

// Create an SQS service object
const sqs = new AWS.SQS({apiVersion: '2012-11-05'});
const queueUrl = "SQS_QUEUE_URL";

// the new endpoint
app.post('/order', (req, res) => {

    let orderData = {
        'userEmail': req.body['userEmail'],
        'itemName': req.body['itemName'],
        'itemPrice': req.body['itemPrice'],
        'itemsQuantity': req.body['itemsQuantity']
    }

    let sqsOrderData = {
        MessageAttributes: {
          "userEmail": {
            DataType: "String",
            StringValue: orderData.userEmail
          },
          "itemName": {
            DataType: "String",
            StringValue: orderData.itemName
          },
          "itemPrice": {
            DataType: "Number",
            StringValue: orderData.itemPrice
          },
          "itemsQuantity": {
            DataType: "Number",
            StringValue: orderData.itemsQuantity
          }
        },
        MessageBody: JSON.stringify(orderData),
        MessageDeduplicationId: req.body['userEmail'],
        MessageGroupId: "UserOrders",
        QueueUrl: queueUrl
    };

    // Send the order data to the SQS queue
    let sendSqsMessage = sqs.sendMessage(sqsOrderData).promise();

    sendSqsMessage.then((data) => {
        console.log(`OrdersSvc | SUCCESS: ${data.MessageId}`);
        res.send("Thank you for your order. Check you inbox for the confirmation email.");
    }).catch((err) => {
        console.log(`OrdersSvc | ERROR: ${err}`);

        // Send email to emails API
        res.send("We ran into an error. Please try again.");
    });
});

AWS SDK требует, чтобы мы создали объект полезной нагрузки, указав данные, которые мы отправляем в очередь, в нашем случае мы определяем его как sqsorderdata Отказ

Затем мы передаем этот объект к SendMessage () Функция, которая отправит наше сообщение в очередь, используя учетные данные, которые мы использовали для настройки AWS CLI. Наконец, мы ждем ответа и уведомим пользователю, что их заказ был успешно получен, и что они должны проверить подтверждение по электронной почте.

Чтобы проверить заказы Сервис, мы запускаем команду NPM начать и отправьте следующую полезную нагрузку на localhost: 8081/заказ :

{
    "itemName": "Phone case",
    "itemPrice": "10",
    "userEmail": "[email protected]",
    "itemsQuantity": "2"
}

Это представит наш заказ на заказы Сервис, откуда сообщение будет отправлено на нашу очередь SQS. Мы можем просмотреть заказ в очереди SQS через консоль AWS, как показано:

SQS Просмотр сообщений

Наше заказы Сервис смог получить заказ пользователя и успешно отправлять данные на нашу очередь на Простая служба очереди Отказ

Реализация: электронная почта Сервис

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

Чтобы наше Письма Сервис постоянно проверяет новые заказы, которые мы будем использовать SQS-потребитель Библиотека, которая будет постоянно и периодически проверять новые заказы и отправлять электронные письма для пользователей. SQS-потребитель Также удалит сообщения из очереди, как только он успешно прочитал их из очереди.

Мы начнем с установки SQS-потребитель Библиотека, запустив следующую команду:

$ npm install sqs-consumer --save

Теперь мы можем реализовать Письма Сервис следующим образом:

const AWS = require('aws-sdk');
const { Consumer } = require('sqs-consumer');

// Configure the region
AWS.config.update({region: 'us-east-1'});

const queueUrl = "SQS_QUEUE_URL";

// Configure Nodemailer to user Gmail
let transport = nodemailer.createTransport({
    host: 'smtp.googlemail.com',
    port: 587,
    auth: {
        user: 'Email address',
        pass: 'Password'
    }
});

function sendMail(message) {
    let sqsMessage = JSON.parse(message.Body);
    const emailMessage = {
        from: 'sender_email_adress',    // Sender address
        to: sqsMessage.userEmail,     // Recipient address
        subject: 'Order Received | NodeShop',    // Subject line
        html: `

Hi ${sqsMessage.userEmail}.Your order of ${sqsMessage.itemsQuantity} ${sqsMessage.itemName} has been received and is being processed.

Thank you for shopping with us!

` // Plain text body }; transport.sendMail(emailMessage, (err, info) => { if (err) { console.log(`EmailsSvc | ERROR: ${err}`) } else { console.log(`EmailsSvc | INFO: ${info}`); } }); } // Create our consumer const app = Consumer.create({ queueUrl: queueUrl, handleMessage: async (message) => { sendMail(message); }, sqs: new AWS.SQS() }); app.on('error', (err) => { console.error(err.message); }); app.on('processing_error', (err) => { console.error(err.message); }); console.log('Emails service is running'); app.start();

Мы создадим новый SQS-потребитель Приложение, используя Потребитель. Create () Функция и укажите URL-адрес запроса и функцию для обработки сообщений, которые выделяются из очереди SQS.

В нашем случае функция sendmail () Возьмем сообщение, извлеченное из очереди, извлеките детали порядка пользователя, затем отправьте электронное письмо пользователю, используя Odemailer Отказ Проверьте нашу статью Отправка электронных писем в Node.js Если вы хотите узнать больше.

Наше Письма Сервис теперь готов. Чтобы интегрировать его в наш сценарий выполнения, мы просто модифицируем Сценарии вариант в нашем Package.json :

{
  // Truncated for brevity...
  "scripts": {
    "start-orders-svc": "node ./orderssvc/index.js 8081",
    "start-emails-svc": "node ./emailssvc/index.js",
    // Update this line
    "start": "npm-run-all -p -r start-orders-svc start-emails-svc"
  },
  // ...
}

Когда мы отправляем новый заказ через заказы Сервис, мы получаем следующее письмо, доставленное в нашем почтовом ящике:

почтовый ящик SQS

Заключение

В этом посте мы использовали Node.js и express для создания API, который должен был получить заказы пользователей и публиковать детали заказа на нашу очередь SQS на AWS. Затем мы построили другую услугу, чтобы получить сообщения, как опубликовано в очередь и отправлять подтверждающие электронные письма для пользователей, которые размещены заказы.

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

Исходный код для этого проекта доступен здесь на Github ./