Cервер слушает запросы на указанном IP:PORT и предоставляет API для простой key-value базы данных. Внутреннее хранилище сервера - key:value-таблица. Ключ имеет тип - Строка (максимальная длина 1024 символа). Значение имеет тип - Строка (максимальная длина 1024 * 1024 символа).
База данных поддерживает операции: INSERT - добавить key:value; UPDATE - изменить key:value; DELETE - удалить key; GET - получить value по key.
- Если ключ уже существует, то при операции INSERT БД возвращает ошибку, что запись не была добавлена.
- Если ключ не существует, то при операции UPDATE БД возвращает ошибку, что запись отсутсвует.
- Если ключ существует и значение совпадает, то при операции UPDATE БД возвращает ошибку, что значение не было изменено.
- Если ключ не существует, то при операции DELETE БД возвращает ошибку об отсутствующей записи.
- Если ключ не существует, то при операции GET БД возвращает ошибку об отсутствующей записи.
Клиент получает из командной строки:
- адрес сервера;
- команду;
- ключ;
- значение.
После выполнения команды клиент возвращает успешность выполнения и ошибку, если она возникла.
Сервер ведет статистику отправленных и полученных команд. С периодичностью в 60 секунд, сервер выводит на std::cerr статистику:
- количество записей в БД
- количество успешных/неуспешных операций INSERT
- количество успешных/неуспешных операций UPDATE
- количество успешных/неуспешных операций DELETE
- количество успешных/неуспешных операций GET
Реализован gRPC-сервер с заданным API. Реализаций БД две: in-memory (по умолчанию) и persistent; последнюю можно выбрать при сборке указанием соответствующей фичи: cargo build --release --no-default-features --features persistent
In-memory БД — стандартный HashMap.
Persistent БД — лог-формат, т.е. новые записи добавляются в конец файла, поиск медленный. Не реализована компактификация файла, т.е. удаление избыточных записей. Не реализован индекс для поиска.
- Rust
- tonic -- gRPC
- tokio -- асинхронность
- structopt -- интерфейс командной строки
-
Юнит-тесты: cargo test --release.
-
Скрипт smoke-test.sh проверяет готовность программ к запуску. В качестве аргумента передаётся feature, с которой нужно собрать сервер: inmemory или persistent.
-
Скрипты integration-test-inmemory.sh и integration-test-persistent.sh исполняют некоторые сценарии работы с проверкой результатов.
-
Скрипт stress-test.sh подвергает сервер повышенной нагрузке и оценивает производительность (не реализовано).