Для успешного выполнения ДЗ вам потребуется использовать базы данных Redis, Scylla, ClickHouse. Крайне рекомендуется использовать Docker для поднятия этих баз данных. Инструкцию по установке сможете найти тут: https://docs.docker.com/get-docker/
Команда для старта Redis:
docker run -d --name redis -p 6379:6379 redisЗайти в консольный клиент Redis:
docker exec -it redis redis-cliКоманда для старта Scylla:
docker run --name scylla -p 9042:9042 -d scylladb/scyllaЗайти в консольный клиент:
# или для Scylla:
docker exec -it scylla cqlshКоманда для старта ClickHouse:
docker run -d --name clickhouse -p 8123:8123 -p 9000:9000 clickhouse/clickhouse-serverЗайти в консольный клиент ClickHouse:
docker exec -it clickhouse clickhouse-clientДелаем себе форк этого репозитория, создаем отдельную ветку в этом форке и пишем решение в этой ветке. Готовый результат скидываем как PR в master своего форка из новой ветки и пишем лектору в Mattermost.
Описание: Redis - это in-memory key-value хранилище, часто используемое для кэширования и rate limiting.
Команды: https://redis.io/commands/
Задание:
- Понять что такое Rate Limiter: https://t.ly/TSIwJ
- Придумать алгоритм его работы на Redis
- В папке
redisлежит maven проект. В зависимостях подключен Redis. В классеRateLimiterнеобходимо используя Redis реализовать методpass(), который будет возвращатьtrue, в случае если лимит запросов не превышен и запрос пропускается, а если же рейт превышен и нужно ограничить запрос, возвращаетсяfalse.
Параметры конструктора RateLimiter:
redis- клиент Jedis для работы с Redislabel- название запроса, рейт которого хотим ограничиватьmaxRequestCount- максимальное количество запросовtimeWindowSeconds- временное окно в секундах
Например, для ограничения 60 rps: maxRequestCount=60, timeWindowSeconds=1.
Как проверить:
- Запустите
main()и нажимайтеEnterдля тестирования - Завершить программу можно написав
q - Запустите тесты (требуется поднятый Redis)
- Тест
slidingWindowTest- задание со звездочкой (дополнительный балл). Если не получилось пройти - закомментируйте его.
Описание: Cassandra/Scylla - это wide column store база данных, где важно проектировать таблицы под конкретные запросы.
Задание: В папке scylla лежит файл schema.sql, представляющий собой схему таблиц, как бы они выглядели в SQL.
Необходимо написать запросы для создания таблицы (или нескольких таблиц) в Cassandra/Scylla и написать CQL
запросы под следующие требования:
-
Запрос, который бы доставал посты заданного пользователя, упорядоченные по времени создания поста (сначала новые). Должен возвращать:
post_id,content, дату создания поста. -
Запрос, который бы доставал последний пост заданного пользователя. Должен возвращать:
post_id,content, дату создания поста,username. -
Запрос, который бы доставал посты заданного пользователя после заданной даты. Должен возвращать:
post_id,content, дату создания поста. -
Запрос, который бы доставал пользователей, сделавших пост в заданный день по заданной теме, упорядоченные по времени (сначала новые). Должен возвращать:
user_id,username,post_id, время создания поста.
Решение (таблицы и запросы) писать в файле scylla/solution.cql.
Описание: ClickHouse - это колоночная аналитическая СУБД, оптимизированная для OLAP запросов и работы с большими объемами данных.
Документация: https://clickhouse.com/docs
Задание: В папке clickhouse находится файл server_logs.csv с логами веб-сервера.
-
Создать таблицу для хранения логов:
- Используйте движок
MergeTree - Выберите подходящий
ORDER BYдля оптимизации запросов - Определите типы данных для каждого поля
- Используйте движок
-
Загрузить данные из CSV файла в таблицу
-
Написать аналитические запросы:
- Топ-5 самых медленных endpoint'ов (по среднему времени ответа
response_time_ms) - Количество запросов по часам за весь период в логах
- Процент ошибок (status_code >= 400) для каждого endpoint'а
- Топ-5 самых медленных endpoint'ов (по среднему времени ответа
Решение писать в файле clickhouse/solution.sql.
Подсказка: для загрузки CSV можно использовать:
cat server_logs.csv | docker exec -i clickhouse clickhouse-client --query="INSERT INTO server_logs FORMAT CSVWithNames"