Создать API endpoint.
- Принимает POST-запросы без авторизации с сообщением из внешнего мессенджера содержащим следующие параметры:
- external_message_id:string (уникальный внешний идентификатор сообщения - 16 байт)
- external_client_id:string (уникальный внешний идентификатор клиента - 16 байт)
- client_phone:string (номер телефона с +7. Пример - +79194961182. Допустим, что номера могут быть только российские (12 символов))
- message_text:string (текст сообщения - до 4096 символов)
- send_at:integer (дата-время отправки в формате unixtime).
- Сохраняет данные в 3 таблицы: clients: информация о клиентах, dialogs: диалоги, связанные с клиентами, messages: сообщения внутри диалогов.
- Обрабатывает дубликаты, обеспечивает целостность данных и высокую производительность.
Для разработки был выбран фреймворк yii2 в минималистичном виде, в программном коде намеренно выбраны решения с наименьшим кол-вом абстракций. Для большего контроля над запросами было отброшено использование ActiveRecord, прямые SQL запросы позволяют за один запрос проверить и вставить данные в БД.
В БД добавлены требуемые таблицы, в каждой имеется первичный ключ и индекс по нему в dialogs добавлен clients_uniq для уникализации диалога к пользователю.
Реализовано кэширование по id сообщения для того, чтобы не обращаться к реляционным данным если этот id уже имеется в базе.
Для улучшения производительности приложение лучше запускать через php-fpm, на случай возросшей нагрузки иметь возможность реплицировать инстансы с приложением, для обработки множества подключений использовать pgbouncer. Желательно кластеризировать redis т.к. появляется необходимость хранить большое кол-во данных в памяти или же периодически старые ключи очищать.