Данный документ описывает тестовое задание, которое должен выполнить претендент на должность PHP Junior Developer (основная часть) либо PHP Middle Developer (основная и бонусные части).
- Система должна корректно работать с PHP 7.1+, MySQL 5.3+.
- Допускается и приветствуется использование фреймворков, библиотек, компонентов.
Система должна корректно отображаться во всех популярных современных браузерах. Допускается и приветствуется использование фреймворков, JS-библиотек.
- На главной странице пользователь видит поле для ввода URL, по нажатию кнопки “Уменьшить” пользователю предоставляется короткая ссылка с текущим доменом сайта вида http://superjob.test/RaNd0m57r1n9.
- При переходе по уменьшенной ссылке любой пользователь будет перенаправлен на исходную страницу.
- Пользователь должен иметь возможность создать свою короткую ссылку (вида http://superjob.test/mytext).
- Пользователь должен иметь возможность создавать ссылки с ограниченным сроком жизни.
Пользователь, создающий ссылку также получает ссылку на статистику переходов. В статистике должна отображаться история всех переходов за все время.
- На основе истории переходов посчитать общее количество уникальных посетителей для каждого URL за последние 14 дней.
- URL могут быть коммерческими. Перед перенаправлением по такому URL в течение 5 секунд пользователю показывается случайная картинка из определенной директории. Показ картинки фиксируется, вопросы оплаты, аутентификации, баланса, лицевых счетов не входят в задание.
Описать возможные проблемы системы и пути их решения в случае, если системой будут пользоваться сто миллионов человек в день.
На компьютере должен быть установлен docker
и docker-compose
В корне проекта запустить:
$ make init
будет собраны и запущены контейнеры приложения. Псле того как mysql будет готов необходимо инициализировать само прилоежние:
$ make app-start
будут собраны js, css файлы, создана база данных и применены миграции, приложение будет доступно по адресу http://localhost:8888/
Для запуска watch webpack выполните
$ make assets-watch
Список всех комманд смотрите в Makefile проекта
TODO: может быть
100 млн. пользователь позразумевает под собой создание сложной хайлоад системы. Данное приложение не является таким. Но возможность масштабирования предусмотрена.
Узкоим местом в данной системе будет в первую очередь база данных. Её необходимо разделить на необходимое кол-во инстансов (в зависимости от нагрузки) - используя балансировку (нас стороне вебсервера) на основе системы префиксов url (например) можно добиться разделения нагрузки между серверами непосредственно отвечающими за герерацию новых и доставание информации о старых ссылках. Естественно информацию о ссылках нужно кешировать уровнем выше что бы ноды приемущественно занимались генерацией новых ссылок.
Систему сбора статистики и идентификации пользователя нужно выделить на отдельные сервера, веротяно придется сделать систему высокопроизводительного сбора данных и не предоставлять статистику мгновенно (генерировать на лету), а сделать систему отчетов которая будет работать на отдельной группе серверов и предоставлять статистику например раз в сутки.
Систему показа комерческой рекламы таже стоит создать отдельно от остальных частей приложения.
Вероятно потребуется система CDN если пользователи будут не локализованы одним регионом.