Основная информация
Сервис уведомлений позволяет пользователям получить уведомление на почту об скором окончании срока подписки. Разработан на чистом PHP 8-ой версии, с минимальным количеством зависимостей.
Концепция работы
Сервис делает 2 основные действия: проверяет пользовательские email'ы, добавляемые в базы, и отправляет пользователям сообщения на почту, когда срок их подписки заканчивается через +- 3 дня. В качестве реализации был выбран подход с запуском команд через cron, так как это упрощает структуру работы сервиса и решает поставленную задачу без дополнительного оверхеда в виде веб-сервера.
Команды, запускаемые через cron:
src/Command/CheckUsersEmailsCommand.php - валидация пользовательских email'ов
src/Command/CheckUsersSubscriptionCommand.php - проверка подписок пользователей
Учитывая паттерн работы php, для избежания долгой работы процессов, команды сбрасывают все проверяемые ими данные в exchange rabbit, который, в свою очередь, разбрасывает сообщения по воркерам.
Воркеры подразумевают постоянную работу в памяти, поэтому их запуск предполагает инструменты демонизации, например - supervisor
src/Command/EmailValidateConsumer - consumer, работающий с задачами на валидацию email'ов
src/Command/UserCheckSubscriptionConsumer - consumer, работающий с задачами на проверку подписки пользователей
Запуск
Перед запуском нужно скопировать .env.dist в .env, и заменить параметры на актуальные.
Сервис докеризован, запустить можно посредством выполнения команды:
docker-compose up --build
Установка зависимостей:
docker-compose exec php composer install
Задачи в cron и воркеры через supervisor в docker не интегрированы, могу сделать по запросу.
Заполнение базы
В качестве библиотеки для работы с миграциями была выбрана библиотека phinx - https://phinx.org/, как наиболее легковесное и поддерживаемое решение с активным комьюнити. Накатка миграций выполняется посредством выполнения внутри контейнера php команды:
./vendor/bin/phinx migrate -e dev
Заполнение базы тестовыми данными можно выполнить посредством выполнения команды:
./vendor/bin/phinx seed:run