Автомасштабирование преобразований изображений Node.js с использованием Sharp и Express

Автомасштабирование преобразований изображений Node.js с использованием Sharp и Express

19 октября 2022 г.

Автоматизация масштабирования приложений — одно из ключевых преимуществ PaaS. В следующем примере показано, как вы можете использовать эту возможность в Zerops, платформе приложений, предназначенной в первую очередь для разработчиков, в частности, при преобразовании изображений путем масштабирования или чередование их с помощью Node.js.

Примечание. Имейте в виду, что код примера не предназначен для обеспечения качества производственного кода. Цель состоит в том, чтобы продемонстрировать функцию масштабирования Zerops. В дальнейшем мы предполагаем, что у вас есть учетная запись Zerops и установленный zcli (инструмент командной строки Zerops).

Написание кода

Код довольно прост. Он использует Express и Sharp для выполнения фактической работы. . Поэтому, пожалуйста, выполните следующее в папке по вашему выбору:

npm i express sharp

Это установит все зависимости в папку node_modules и, что более важно, создаст файлы package.json и package-lock.json.

Затем создайте файл index.js и вставьте следующий код:

const sharp = require("sharp")
const express = require('express')
const expressServer = express()

expressServer.get('/image', (request, response) => {

  const requestedWidth = request.query.width ? parseInt(request.query.width) : 300;
  const requestedHeight = request.query.height ? parseInt(request.query.height) : 300;
  const requestedAngle = request.query.angle ? parseInt(request.query.angle) : 0;
  const format = 'jpg';

  console.log(`Handling image: size to ${requestedWidth}x${requestedHeight} and rotation to ${requestedAngle}`)

  sharp('example.jpg')
    .resize(requestedWidth, requestedHeight, {
      fit: sharp.fit.inside,
    })
    .rotate(requestedAngle)
    .toFormat(format)
    .toBuffer()
    .then(function (outputBuffer) {
      response.type(format);
      response.end(outputBuffer)
    });
})

expressServer.listen(3000, () => {
  console.log(`Listening on port 3000.`)
})

Вы можете использовать любое изображение в формате jpg как example.jpg. Пожалуйста, поместите один в эту папку. Вот и все. Просто обычный код (и изображение).

Настройка проекта в Zerops

После того как у вас будет готов код, вам нужно создать проект в Zerops. Для этого, пожалуйста:

  1. Войдите в Zerops
  2. Создайте проект, нажав Добавить новый проект
  3. .
  4. Укажите название проекта, например. изображение
  5. Выберите Node.js в качестве добавляемой службы
  6. Нажмите Установить высокую доступность?
  7. Нажмите "Добавить".

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

Сборка и развертывание на Zerops

Следующие шаги описывают, как можно создать и развернуть пример как приложение Zerops.

  • Чтобы Zerops знал, какие файлы использовать, создайте файл zerops.yml следующим к другим файлам:

nodejs0: build: base: [ nodejs@16 ] build: - npm ci cache: [ node_modules ] deploy: [ index.js, example.jpg, node_modules ] run: start: node index.js

* Просто разверните файл

zcli push "изображение" nodejs0

* Включить доступ к поддомену Zerops через Public access & внутренние порты в службе nodejs0 и вызовите предварительно созданный URL-адрес в своем браузере.

Автомасштабирование в действии

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

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

Вот скрипт для генерации загрузки k6.js:

import http from 'k6/http';
import { check } from 'k6';

export default function () {
  const baseUrl = "https://<your-generated-subdomain>.usc1.contabozerops.com"
  const width = 300 + Math.random() * 1000
  const height = 300 + Math.random() * 1000
  const angle = Math.random() * 360
  const res = http.get(`${baseUrl}/image?width=${width}&height=${height}&angle=${angle}`)
  check(res, {
    'is status 200': (r) => r.status === 200,
  });
}

А затем запустите его, вызвав

k6 run --vus 100 --duration 120s k6.js

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

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

Zerops Scaling up -- vertically and horizontally

После того, как скрипт k6 завершит создание нагрузки, Zerops подождет некоторое время, чтобы убедиться, что спрос действительно снизился. . Затем вы сначала увидите, как вертикальное автомасштабирование начинает действовать, уменьшая количество виртуальных ЦП (из-за характера нашего примера). Количество виртуальных ЦП резко сократилось.

n Масштабирование Zerops — вертикальное охлаждение

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

n Zerops Scaling -- горизонтальное охлаждение

Обзор

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

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


Также опубликовано здесь.< /p>


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE