- PHP 7.3+
- MySQL 5.7+
- 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
-
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 Tablemessages_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 час на исправления, связанные с изначально неправильно понятым ТЗ