Курсовой проект 2019 года курса "Highload системы" в Технополис.
Форкните проект, склонируйте и добавьте upstream
:
$ git clone [email protected]:<username>/2019-highload-dht.git
Cloning into '2019-highload-dht'...
...
$ git remote add upstream [email protected]:polis-mail-ru/2019-highload-dht.git
$ git fetch upstream
From github.com:polis-mail-ru/2019-highload-dht
* [new branch] master -> upstream/master
Так можно запустить тесты:
$ gradle test
А вот так -- сервер:
$ gradle run
Откройте в IDE -- IntelliJ IDEA Community Edition нам будет достаточно.
ВНИМАНИЕ! При запуске тестов или сервера в IDE необходимо передавать Java опцию -Xmx128m
.
В своём Java package ru.mail.polis.service.<username>
реализуйте интерфейс Service
и поддержите следующий HTTP REST API протокол:
- HTTP
GET /v0/entity?id=<ID>
-- получить данные по ключу<ID>
. Возвращает200 OK
и данные или404 Not Found
. - HTTP
PUT /v0/entity?id=<ID>
-- создать/перезаписать (upsert) данные по ключу<ID>
. Возвращает201 Created
. - HTTP
DELETE /v0/entity?id=<ID>
-- удалить данные по ключу<ID>
. Возвращает202 Accepted
.
Возвращайте реализацию интерфейса в ServiceFactory
.
Реализацию DAO
берём из весеннего курса 2019-db-lsm
, либо запиливаем adapter к уже готовой реализации LSM с биндингами на Java (например, RocksDB, LevelDB или любой другой).
Проведите нагрузочное тестирование с помощью wrk в одно соединение.
Почему не curl
/F5, можно узнать здесь и здесь.
Попрофилируйте (CPU и alloc) под нагрузкой с помощью async-profiler и проанализируйте результаты.
Продолжайте запускать тесты и исправлять ошибки, не забывая подтягивать новые тесты и фиксы из upstream
.
Если заметите ошибку в upstream
, заводите баг и присылайте pull request ;)
Когда всё будет готово, присылайте pull request со своей реализацией и оптимизациями на review. Не забывайте отвечать на комментарии в PR (в том числе автоматизированные) и исправлять замечания!
Обеспечьте потокобезопасность реализации DAO
с помощью synchronized
, а лучше -- с использованием примитивов java.util.concurrent.*
.
Прокачаться можно с руководством Java Concurrency in Practice.
Сконфигурируйте HTTP сервер, чтобы он обрабатывал запросы с помощью пула из нескольких потоков.
Проведите нагрузочное тестирование с помощью wrk в несколько соединений.
Отпрофилируйте приложение (CPU, alloc и lock) под нагрузкой с помощью async-profiler и проанализируйте результаты.
Когда всё будет готово, присылайте pull request со своей реализацией и оптимизациями на review.
Реализуйте асинхронный HTTP сервер на основе one-nio.
Проведите нагрузочное тестирование с помощью wrk в несколько соединений с разными видами запросов.
Попрофилируйте приложение (CPU, alloc и lock) под нагрузкой с помощью async-profiler и проанализируйте результаты.
Реализуйте получение диапазона данных с помощью HTTP GET /v0/entities?start=<ID>[&end=<ID>]
, который возвращает:
- Статус код
200 OK
- Возможно пустой отсортированный (по ключу) набор ключей и значений в диапазоне ключей от обязательного
start
(включая) до опциональногоend
(не включая) - Использует Chunked transfer encoding
- Чанки в формате
<key>\n<value>
Диапазон должен отдаваться в потоковом режиме без формирования всего ответа в памяти.
Когда всё будет готово, присылайте pull request с изменениями, результатами нагрузочного тестирования и профилирования, а также анализом результатом по сравнению с предыдущей (блокирующей) версией.