Тестовое задание Вольдэмара Дулецкого в компанию Appbooster
Задание
Написать на ruby web-сервер, который возвращает текущее время UTC. Опционально сервер может принимать названия городов и показывать текущее время для них.
Также сервер должен максимально быстро возвращать результат и поддерживать большое кол-во соединений.
Примеры запросов:
/time
UTC: 2015-04-11 10:30:50
/time?Moscow,New%20York
UTC: 2015-04-11 10:30:50
Moscow: 2015-04-11 13:30:50
New York: 2015-04-11 02:30:50
Цель
Обеспечить стабильный веб-сервис работащий на процессах для обеспеченя максимального числа одновременных соединений. В основу была взята модель работы веб-сервера Unicorn.
SETUP
Для работы скрипта необходимо выполнить следующие действия:
brew install vegeta #установка тулзы для бенчмарка
cd %ПУТЬ_ДО_ПРОЕКТА_%
bundle install
ruby ./utc.rb #запускаем версию в один поток
ruby ./utc_process.rb # в новом табе запускаем в несколько процессов
Бенчмарки
*результаты справедливы для Macbook Pro 4x 2,2 GHz Intel Core i7, 16 Gb RAM
Одним процессом
➜ ~ echo "GET http://localhost:8081/time?Kaliningrad,Moscow,Petersburg" | vegeta attack -duration=30s -rate=200 | tee results.bin | vegeta report
Requests [total, rate] 6000, 200.03
Duration [total, attack, wait] 29.997413377s, 29.994999771s, 2.413606ms
Latencies [mean, 50, 95, 99, max] 530.770787ms, 374.862024ms, 1.532831826s, 1.663431075s, 1.717920767s
Bytes In [total, mean] 514917, 85.82
Bytes Out [total, mean] 0, 0.00
Success [ratio] 73.35%
Status Codes [code:count] 200:4401 0:1599
Видим, что число необработанных запросов порядка 25%
При использовании мультипроцессовой версии
➜ ~ echo "GET http://localhost:8082/time?Kaliningrad,Moscow,Petersburg" | vegeta attack -duration=30s -rate=200 | tee results.bin | vegeta report
Requests [total, rate] 6000, 200.03
Duration [total, attack, wait] 29.998023499s, 29.994999908s, 3.023591ms
Latencies [mean, 50, 95, 99, max] 2.902841ms, 2.816928ms, 3.604252ms, 4.420398ms, 26.696699ms
Bytes In [total, mean] 700596, 116.77
Bytes Out [total, mean] 0, 0.00
Success [ratio] 99.80%
Status Codes [code:count] 200:5988 0:12
Видим, что число необработанных запросов порядка 0.23%
Итог:
В мультипроцессовом режиме веб-сервис держит 350 одновременных соединений с долей удачных ответов в 99.5%