Skip to content

AzGothic/aff1_com

Repository files navigation

Aff1.com / Test

Require

  • PHP 7.3+
  • MySQL 5.7+

Install

  • Run composer install
    $ composer install
  • Configure .env file with your params of DB and Mail
  • Run migrations
    $ php artisan migrate
  • Run Main seeder
    $ php artisan db:seed --force
  • Run Dev seeder (only for local/dev version)
    $ php artisan db:seed --class=DevSeeder

Usage

  • Run command to process emails send job
    $ php artisan email:send [time] [--info]
    time - time to process, default - current H:i. Take needed time from DB Table messages_schedule and use for tests
    --info - show log to console, default - disabled

  • Examples
    Default run with current time and without info
    $ php artisan email:send
    Run with current time and with info
    $ php artisan email:send --info
    Run with defined time and without info
    $ php artisan email:send 01:30
    Run with defined time and with info
    $ php artisan email:send 01:30 --info

Задание

В компании есть база клиентов, которым нужно на протяжении дня отправлять сообщения по email. Каждый клиент находится в своей временной зоне. У каждого сообщения есть расписание отправки (например 12:00, 13:02). Каждое сообщение может быть отправлено неограниченное количество раз на протяжении дня и не привязываются к клиентам.
Нужно написать консольную команду, которая будет отправлять email-сообщения клиентам в нужное время по часовому поясу клиента при условии, что сервер приложения работает по UTC+02:00. Хранить сообщения, расписание и клиентов нужно в БД. Создать модели, миграции, сидеры.

При разработке учитывать размер базы сообщений и клиентов.
Клиентов в базе - 1 млн.
Сообщений - 10 тыс.

Требования: использовать фреймворк Laravel.
Сообщить время выполнения задания.

Решение

Расписание не привязано к определенному дню, а только ко времени, поэтому отрабатываться будут в любой день, когда будет запущен скрипт.
Если подобный скрипт кидать в крон, то нужно кидать на нужные дни каждую минуту.

Что нужно, но не реализовано

Для нормальной работы с вышеуказанной базой и большим потоком имейлов - обязательно нужны очереди. В идеале что-то нормальное, например, тот же RabbitMQ. Т.е. текущий скрипт должен не отправлять имейлы, а ставить их в очередь на отправку, а уже отдельные воркеры должны подхватывать данные из очереди и заниматься постепенной их отправкой. При нормальном SMTP сервере и производительности серверов можно запустить несколько воркеров отправки параллельно и ускорить отработку очереди до нужных/возможных значений. Текущая реализация не позволит быстро отрабатывать тысячи имейлов, да и в целом может збоить из-за перенагрузок на сервер, если не будет успевать отрабатывать один запуск за минуту и в паралелль выстроится несколько запусков.
Либо все это счастье увести на какой-то сервис рассылки имейлов, по типу того же MailChimp'a, но тогда и сам контент имейлов и расписания лучше изначально строить там...
Не реализовано - т.к. это уже больше похоже на реальную разработку, а не на тестовое задание и требует гораздо больших затрат времени на проектирование и реализацию.

Затраты по времени

~ 2-3 часа на саму разработку, ну и чуть времени на документирование и всякие описюльки.
~ 1 час на исправления, связанные с изначально неправильно понятым ТЗ

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published