Использовались при выполнении:
- XAMPP PHP 7.4.5 (с расширением php_redis.dll для взаимодействия с сервером Redis)
- Laravel 8
- Redis Server 5.0.8 (WSL Ubuntu 20.04.1)
- Isomnia Core 2020.5.2 (отладка API)
- Visual Studio Code 1.45.1 (редактор IDE)
В тесте не указана задача авторизации при API запросах, реализован публичный доступ к API с валидацией запросов (подробности ниже в тексте). Весь код прокомментирован на английском языке. В проекте Laravel 8 включен драйвер кеширования Redis, кеширование запросов при отказе конечного сервиса тоже реализовано при помощи Redis.
Основной файл решения задачи теста. Принимает, валидирует (при помощи стандартных средств Laravel и кастомного хелпера) отправляет запросы на конечный API. При отказе конечного сервиса кеширует уникальные сообщения в Redis SET (SADD) (дубли уникальных сообщений исключены). Вместимость Redis SET кеша - около 4 миллиардов записей. Пример работы API из Insomnia Core: Конечный результат отправки (имплементирован как запись в лог, подробнее ниже в тексте): Пример работы с кешированием при отказе конечного сервиса (отличие запросов - разные номера во входящем параметре json - "to"):
Прошедший запрос и отправка-запись всех предыдущих сообщений SMS в лог:
Имплементация конечного сервиса в тесте с записью в настроенный в настройках Laravel лог файл отправленных SMS сообщений. Ошибка при недоступности сервиса имплементирована согласно задаче в тесте:
Миддлвэр хелперы, реализованы в ввиде статических методов класса с входящими аргументами. Проверка входящего запроса на соответствие POST и application/json, если условия не выполнены страница API покажет стандартую для Laravel ошибку 404. При несоответствии запроса application/json параметрам стандарта API (валидация запроса происходит стандартными средствами Laravel) отправка json сообщения 400 о неверных параметрах запроса. Метод запускающий инстанс Redis объекта для проведения операций с Redis сервером.
В данный файл внесены пути имплементированных API, принимаются любые запросы для избежания отображения debug остнастки Laravel при любых условиях. Возможно легкое изменение метода any на post при необходимости. Пути ведут к конструкторам классов указанных выше API, для возможной имплементации дополнительных методов в рамках класса для данных API и более гибкой работы в рамках объекта.
В данном файле производилось включение драйвера кеша Redis, параметр основного драйвера был изменен с "file" на "redis".
В файле был установлен кастомный файл лога в стандартной папке для логов storage\logs\ для записи "отправленных" SMS - sendmessageservice.log.
Сервис для отправки массовых сообщений
Что имеем:
- Laravel 8
- MySQL
- Redis
- Сервис SendMessage
Сервис SendMessage
У сервиса реализован только 1 метод:
Отправка SMS сообщения: POST https://send.message/api/send (пример) application/json { “to”: 123, // ID получателя “message”: “Hello world!” // Сообщение }
Данный метод позволяет отправить только 1 сообщение за раз.
Метод возвращает следующие коды ответа: 200: Cообщение успешно обработано. 500: Cервис временно недоступен (произошла ошибка)
Что нужно:
Создать REST-сервис для возможности массовой отправки писем.
Пример тела запроса: application/json { “to”: [123, 321], // ID получателей “message”: “Hello world!” // Сообщение }
Требование:
Сервис должен максимально быстро обрабатывать запрос на массовую отправку сообщений и гарантировать передачу всех писем в сервис SendMessage
Итог задания:
Ссылка на открытый репозиторий git с результатом задания, только код, без запуска проекта.
Спасибо Вам за прочтение, С уважением Владимир Горбачев