- Домашние задания
- Заготовка для социальной сети
- Производительность индексов
- Лента новостей социальной сети
- Полусинхронная репликация
- In-Memory СУБД
- Шардирование
- Онлайн обновление ленты новостей
- Разделение монолита на сервисы
- [Отказоустойчивость приложений](homeworks.md#application fault tolerance)
- Сервис счетчиков
Заготовка для социальной сети Цель: В результате выполнения ДЗ вы создадите базовый скелет социальной сети, который будет развиваться в дальнейших ДЗ. В данном задании тренируются навыки:
- декомпозиции предметной области;
- построения элементарной архитектуры проекта
Требуется разработать создание и просмотр анект в социальной сети.
Функциональные требования:
- Авторизация по паролю.
- Страница регистрации, где указывается следующая информация:
- Имя
- Фамилия
- Возраст
- Пол
- Интересы
- Город
- Страницы с анкетой.
Нефункциональные требования:
- Любой язык программирования
- В качестве базы данных использовать MySQL
- Не использовать ORM
- Программа должна представлять из себя монолитное приложение.
Не рекомендуется использовать следующие технологии:
- Репликация
- Шардинг
- Индексы
- Кэширование
Верстка не важна. Подойдет самая примитивная.
Разместить приложение на любом хостинге. Например, heroku.
ДЗ принимается в виде исходного кода на github и демонстрации проекта на хостинге.
Критерии оценки:
[ ] Оценка происходит по принципу зачет/незачет.
Требования: Есть возможность регистрации, создавать персональные страницы, возможность подружиться, список друзей. Отсутствуют SQL-инъекции. Пароль хранится безопасно.
Рекомендуем сдать до: 20.04.2021
В результате выполнения ДЗ вы создадите набор тестовых данных для проведения нагрузочного тестирования, подберете наиболее подходящие индексы и проведете тесты производительности. В данном задании тренируются навыки:
- генерация тестовых данных;
- работа с индексами;
- нагрузочное тестирование;
- Сгенерировать любым способ 1,000,000 анкет. Имена и Фамилии должны быть реальными (чтобы учитывать селективность индекса)
- Реализовать функционал поиска анкет по префиксу имени и фамилии (одновременно) в вашей социальной сети (запрос в форме firstName LIKE ? and secondName LIKE ?). Сортировать вывод по id анкеты. Использовать InnoDB движок.
- С помощью wrk провести нагрузочные тесты по этой странице. Поиграть с количеством одновременных запросов. 1/10/100/1000.
- Построить графики и сохранить их в отчет
- Сделать подходящий индекс.
- Повторить пункт 3 и 4. В качестве результата предоставить отчет в котором должны быть:
- графики latency до индекса;
- графики throughput до индекса;
- графики latency после индекса;
- графики throughput после индекса;
- запрос добавления индекса;
- explain запросов после индекса;
- объяснение почему индекс именно такой; ДЗ принимается в виде отчета по выполненной работе.
Критерии оценки: Оценка происходит по принципу зачет/незачет.
Требования: Правильно выбраны индексы. Нагрузочное тестирование проведено и результаты адекватны.
Рекомендуем сдать до: 13.05.2021
Цель: В результате выполнения ДЗ вы создадите ленту новостей социальной сети В данном задании тренируются навыки:
- работа с кешами;
- работа с очередями;
- проектирование масштабируемых архитектур. Разработать ленту новостей. Добавить функционал "добавление поста". Создается отдельная страница, куда пишутся все обновления друзей. Для этого нужно хранить подписчиков. Лента формируется на уровне кешей. Формирование ленты производить через постановку задачи в очередь на часть подписчиков, чтобы избежать эффекта леди Гаги. В ленте держать последние 1000 обновлений друзей. Лента должна кешироваться.
ДЗ сдается в виде ссылки на гитлаб и демонстрации работающего проекта, развернутого в интернете.
Критерии оценки: Оценка происходит по принципу зачет/незачет.
Требования: Верно работает инвалидация кеша. Обновление лент работает через очередь. Есть возможность перестройки кешей из СУБД.
Рекомендуем сдать до: 25.05.2021
В результате выполнения ДЗ вы настроите полусинхронную репликацию, протестируете ее влияние на производительность системы и убедитесь, что теперь вы не теряете транзакции в случае аварии. В данном задании тренируются навыки:
- обеспечение отказоустойчивости проекта;
- администрирование MySQL;
- настройка репликации;
- проведение нагрузочных тестов.
- Настраиваем асинхронную репликацию.
- Выбираем 2 любых запроса на чтения (в идеале самых частых и тяжелых по логике работы сайта) и переносим их на чтение со слейва.
- Делаем нагрузочный тест по странице, которую перевели на слейв до и после репликации. Замеряем нагрузку мастера (CPU, la, disc usage, memory usage).
ОПЦИОНАЛЬНО: в качестве конфига, который хранит IP реплики сделать массив для легкого добавления реплики. Это не самый правильный способ балансирования нагрузки. Поэтому опционально.
- Настроить 2 слейва и 1 мастер.
- Включить row-based репликацию.
- Включить GTID.
- Настроить полусинхронную репликацию.
- Создать нагрузку на запись в любую тестовую таблицу. На стороне, которой нагружаем считать, сколько строк мы успешно записали.
- С помощью kill -9 убиваем мастер MySQL.
- Заканчиваем нагрузку на запись.
- Выбираем самый свежий слейв. Промоутим его до мастера. Переключаем на него второй слейв.
- Проверяем, есть ли потери транзакций.
Результатом сдачи ДЗ будет в виде исходного кода на github и отчета в текстовом виде, где вы отразите как вы выполняли каждый из пунктов.
Критерии оценки: Оценка происходит по принципу зачет/незачет.
Требования: В отчете корректно описано, как настроена репликация. 2 запроса переведено на чтение со слейва. Нагрузочное тестирование показало, что нагрузка перешла на слейв. В отчете описано как включить row-based репликацию и GTID Проведен эксперимент по потере и непотере транзакций при аварийной остановке master.
Рекомендуем сдать до: 20.05.2021
Репликация из MySQL в tarantool Цель: В результате выполнения ДЗ вы настроите репликацию из MySQL в tarantool, а также напишите запрос на lua. В данном задании тренируются навыки:
- администрирование MySQL;
- администрирование tarantool;
- разработка хранимых процедур для tarantool.
- Выбрать любую таблицу, которую мы читаем с реплик MySQL.
- С помощью программы https://github.com/tarantool/mysql-tarantool-replication настроить реплицирование в tarantool (лучше всего версии 1.10).
- Выбрать любой запрос и переписать его на lua-процедуру на tarantool.
- Провести нагрузочное тестирование, сравнить tarantool и MySQL по производительности.
ДЗ сдается в виде ссылки на гитлаб и отчета о выполнении ДЗ.
Критерии оценки:
Оценка происходит по принципу зачет/незачет.
Требования: Репликация из MySQL в tarantool работает. Хранимые процедуры в tarantool написаны корректно. Хранимые процедуры выполнены по code style на примере репозитория Mail.Ru. Нагрузочное тестирование проведено.
Рекомендуем сдать до: 24.06.2021
Масштабируемая подсистема диалогов
Цель: "В результате выполнения ДЗ вы создадите базовый скелет микросервиса, который будет развиваться в дальнейших ДЗ. В данном задании тренируются навыки:
декомпозиции предметной области; построения элементарной архитектуры проекта" Необходимо написать систему диалогов между пользователями. Обеспечить горизонтальное масштабирование хранилищ на запись с помощью шардинга. Предусмотреть:
Возможность решардинга “Эффект Леди Гаги” (один пользователь пишет сильно больше среднего) Наиболее эффективную схему. ДЗ принимается в виде исходного кода на github и отчета по выполненной работе.
Критерии оценки: Оценка происходит по принципу зачет/незачет.
Требования: Верно выбран ключ шардирования с учетом "эффекта Леди Гаги" В отчете описан процесс решардинга без даунтайма
Рекомендуем сдать до: 08.07.2021
Онлайн обновление ленты новостей
Цель: В результате выполнения ДЗ вы научитесь обновлять ленту новостей без перезагрузки страницы. В данном задании тренируются навыки:
работа с WebSocket; Разработать компонент, куда будет подключаться клиент при открытии страницы ленты. Сервис должен слушать очередь обновлений ленты. При получении подписанным клиентом сообщения, отправлять его в браузер по WebSocket. Учесть возможность масштабирования сервиса. То есть сообщение должно доставляться только на тот экземпляр компонента, куда соединен клиент. Для этого можно использовать, например Routing Key из Rabbitmq.
ДЗ принимается в виде исходного кода на github, документации по архитектуре и демонстрации работоспособности развернутого в интернете приложения.
Критерии оценки: Оценка происходит по принципу зачет/незачет.
Требования: При добавлении поста у друга, лента должна обновляться автоматически (с небольшой задержкой). Корректная работа сервиса вебсокетов. Линейная масштабируемость сервиса вебсокетов. Описан процесс масштабирования RabbitMQ.
Рекомендуем сдать до: 13.07.2021
Разделение монолита на сервисы
Цель: В результате выполнения ДЗ вы перенесете бизнес-домен монолитного приложения в отдельный сервис. В данном задании тренируются навыки:
декомпозиции предметной области; разделение монолитного приложения; работа с HTTP; работа с REST API и gRPC; Вынести систему диалогов в отдельный сервис. Взаимодействия монолитного сервиса и сервиса чатов реализовать на Rest API или gRPC. Организовать сквозное логирование запросов. Предусмотреть то, что не все клиенты обновляют приложение быстро и кто-то может ходить через старое API.
ДЗ сдается в виде исходного кода на github и отчета по устройству системы.
Критерии оценки: Оценка происходит по принципу зачет/незачет.
Требования: Описан протокол взаимодействия. Поддержаны старые клиенты. Новые клиенты верно ходят через новый API.
Рекомендуем сдать до: 20.07.2021
Отказоустойчивость приложений
Цель: В результате выполнения ДЗ вы уменьшите число точек отказа в вашем приложении. В данном задании тренируются навыки:
проектирование отказоустойчивых архитектур; настройка nginx; настройка HAProxy. Поднять несколько слейвов MySQL. Реализовать соединение со слейвами mysql через haproxy. Поднять несколько приложений и обеспечить их балансировку через nginx. Воспроизвести нагрузку. Под нагрузкой с помощью "kill -9" отключить один из слейвов MySQL. Убедится, что система осталась работоспособной. Под нагрузкой с помощью "kill -9" отключить один из инстансов бэкенда. Убедится, что система осталась работоспособной.
ДЗ принимается в виде отчета по выполненным пунктам.
Критерии оценки: Оценка происходит по принципу зачет/незачет.
Требования: В отчете верно описана конфигурация haproxy. В отчете верно описана конфигурация nginx. В отчете верно описаны условия эксперимента. В отчете должны быть логи работы системы.
Рекомендуем сдать до: 26.07.2021
Сервис счетчиков
Цель: В результате выполнения ДЗ вы создадите сервис счетчиков. Сервис будет хранить такие счетчики, как число непрочитанных сообщений. В данном задании тренируются навыки:
разработка отказоустойчивых сервисов; использование кешей. Разработайте сервис счетчиков. Учтите то, что на этот сервис будет большая нагрузка, особенно на чтение. Продумайте, как обеспечить консистентность между счетчиком и реальным числом непрочитанных сообщений. Например, используйте паттерн SAGA. Внедрите сервис для отображения счетчиков. ДЗ сдается в виде демонстрации работоспособности сервиса, ссылки на репозиторий github, отчета по архитектуре.
Критерии оценки: Оценка происходит по принципу зачет/незачет.
Требования: Верно описан выбранный паттерн обеспечения консистентности. Выбранная архитектура сервиса подходит для решения задачи.
Рекомендуем сдать до: 02.08.2021