Настройте свою собственную очередь сообщений и задание cron в своей капле DigitalOcean.

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

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

Например, вместо настройки брокеров сообщений на серверах Linux вы можете использовать решение «Очередь как услуга». Вы хотите запускать запланированные задачи? Не беспокойтесь о настройке cron-воркеров на своих серверах, просто используйте решение «Функция как услуга».

Если вы работаете в среде с интенсивным трафиком, где простои недопустимы, использование этих сторонних решений вполне разумно. Вместо самостоятельного решения просто делегируйте ответственность стороннему сервису.

Так зачем беспокоиться?

В этой статье я расскажу о конфигурации VPS (виртуального частного сервера). Основное внимание в статье будет уделено очередям (rabbitMQ) и задачам cron (gocron).

Я пишу эту статью по двум основным причинам. Если вы здесь из-за подобного любопытства, эта статья для вас, независимо от вашего уровня.

  1. Чтобы иметь возможность оценить, как дела обстояли в прошлом.
  2. Разработайте практическое понимание того, как очереди и cron-workers могут быть реализованы на веб-сервере.

Вы услышите истории от ветеранов отрасли. Представьте, что вы начали работать в новой компании. Вам было поручено настроить или поддерживать приложение, развернутое на локальном сервере. Конфигурация массовая. Возможно, на одной машине работает несколько СУБД. Есть cron-воркеры, которые запускаются на ночь для выполнения некоторых задач. Вещи могут стать слишком сложными очень легко.

Во-вторых, я думаю, что очень сложно работать в среде, где нет понимания того, как разные компоненты работают на более низком уровне. Это напоминает мне фильм «Форд против Феррари». Легендарный автомобильный дизайнер и механик Кен Майлз также был отличным гонщиком. Вы могли слышать, что многие другие гонщики также были хорошими механиками (например, Михаэль Шумахер).

Почему DigitalOcean?

Для этого упражнения я решил использовать дроплет DigitalOcean вместо популярного AWS EC2 (или аналогичных альтернатив). Капли DO очень просты в настройке. Я также нахожу DO Dashboard очень интуитивно понятным.

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

Предположения

Чтобы сделать это упражнение более интерактивным, я решил развернуть RESTful API, который обрабатывает HTTP-запросы, запускающие процесс постановки в очередь. Приложение работает как служба systemd в фоновом режиме и перезапускается при перезагрузке сервера. Вы можете найти репо этого приложения здесь. Обратите внимание, что это приложение использует Postgresql, что требует дополнительной настройки. Если вы хотите использовать это приложение, вы можете упростить его или написать свой собственный код.

Создание RESTful API не является обязательным шагом для этого упражнения, и я не буду рассказывать, как его создать или как развернуть это приложение на нашем VPS.

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

Окончательная конфигурация VPS

В следующей главе, Часть 1, мы настроим RabbitMQ и добавим функциональность в очередь в наше приложение.

После того, как мы подтвердим, что наша очередь содержит сообщения, поставленные в очередь нашим приложением, мы перейдем к Части 2. Здесь мы создадим приложение Go, которое удаляет из очереди сообщения. Мы продолжим работу приложения как службы systemd.

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

До встречи во 2 главе 👋

Ресурсы