balamyt92 / super_shorter

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Выполненное тестовое задание для Красцветмет

Описание задания

Данный документ описывает тестовое задание, которое должен выполнить претендент на должность 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 секунд пользователю показывается случайная картинка из определенной директории. Показ картинки фиксируется, вопросы оплаты, аутентификации, баланса, лицевых счетов не входят в задание.

Часть со звездочкой:

Описать возможные проблемы системы и пути их решения в случае, если системой будут пользоваться сто миллионов человек в день.

Инструкция по запуску dev окружения

На компьютере должен быть установлен docker и docker-compose

В корне проекта запустить:

$ make init

будет собраны и запущены контейнеры приложения. Псле того как mysql будет готов необходимо инициализировать само прилоежние:

$ make app-start

будут собраны js, css файлы, создана база данных и применены миграции, приложение будет доступно по адресу http://localhost:8888/

Для запуска watch webpack выполните

$ make assets-watch

Список всех комманд смотрите в Makefile проекта

Продакш окружени

TODO: может быть

Часть со звездочкой

100 млн. пользователь позразумевает под собой создание сложной хайлоад системы. Данное приложение не является таким. Но возможность масштабирования предусмотрена.

Узкоим местом в данной системе будет в первую очередь база данных. Её необходимо разделить на необходимое кол-во инстансов (в зависимости от нагрузки) - используя балансировку (нас стороне вебсервера) на основе системы префиксов url (например) можно добиться разделения нагрузки между серверами непосредственно отвечающими за герерацию новых и доставание информации о старых ссылках. Естественно информацию о ссылках нужно кешировать уровнем выше что бы ноды приемущественно занимались генерацией новых ссылок.

Систему сбора статистики и идентификации пользователя нужно выделить на отдельные сервера, веротяно придется сделать систему высокопроизводительного сбора данных и не предоставлять статистику мгновенно (генерировать на лету), а сделать систему отчетов которая будет работать на отдельной группе серверов и предоставлять статистику например раз в сутки.

Систему показа комерческой рекламы таже стоит создать отдельно от остальных частей приложения.

Вероятно потребуется система CDN если пользователи будут не локализованы одним регионом.

About


Languages

Language:PHP 65.2%Language:HTML 17.0%Language:JavaScript 15.5%Language:Makefile 2.0%Language:CSS 0.2%