======================================================================== Описание задачи: ======================================================================== Есть некоторое количество генераторов, производящих произвольные натуральные числа. Генераторы работают с разной скоростью. Генерируемые даные поступают на вход системы посредством вызова http api метода /put. Система должна собирать входной поток данных и вычленять из него непрерывные монотонно возрастающие цепочки, а также уметь выводить N (задается в конфигурационном файле) самых длинных цепочек посредством вызова http api метода /get. Запрещено хранить данные где-либо, кроме оперативной памяти. Требования к системе: ---------------------------------- - Система должна уметь работать с большим количеством генераторов и с большим объемом входных данных в течение длительного времени. - API (put. get) должен удовлетворять требованиям REST. - Система должна быть документирована в достаточном для понимания принципов ее работы виде. - Создавать тестовые генераторы не требуется - необходимо только предоставить API, но если кандидат создаст генераторы - то это будет являться плюсом. - Задача выполняется на языке erlang с использованием web-сервера yaws. - Рекомендуется использовать OTP. ======================================================================== Реализация, настройка и тестирование ======================================================================== Архитектура: * chain_app.erl (application) - модуль приложений * chain_sup.erl (supervisor) - главный супервизор * chain_detector.erl (gen_server) - процесс определяющий и сохраняющий цепочки * chain.erl - шорткаты для запуска/останова приложения * yapp_mod.erl - appmod для Yaws сервера, реализующий REST протокол * generators.erl - простая реализация генераторов Кол-во хранимых цепочек задается в файле include/settings.hrl -define(MAX_CHAINS, 10). Для запуска необходимо добавить в конфиг yaws.conf нижеследующе строки и перезапустить yaws сервер ebin_dir = /opt/yaws/lib/yapp/ebin ebin_dir = /home/.../chain/ebin # где находится chain приложение runmod = yapp <server external_server> port = 8000 listen = 0.0.0.0 docroot = /opt/yaws/var/yaws/www arg_rewrite_mod = yapp <opaque> yapp_server_id = external bootstrap_yapps = chain </opaque> </server> Проверка через curl curl -XPUT -d "1" http://127.0.0.1:8000/chain/ curl -XPUT -d "2" http://127.0.0.1:8000/chain/ curl -XPUT -d "3" http://127.0.0.1:8000/chain/ curl -XPUT -d "1" http://127.0.0.1:8000/chain/ curl http://127.0.0.1:8000/chain/ должен вернуть [undefined,undefined,undefined,undefined,[1,2,3]] Проверка через запуск генераторов cd ebin erl 1> Pids = generators:start(5). в соседней консоли можно смотреть изменение цепочек curl http://127.0.0.1:8000/chain/ остановить генераторы: 3> generators:stop(Pids).