MaratFM / chain

Chain detection test appliacation

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

========================================================================
Описание задачи:
========================================================================

Есть некоторое количество генераторов, производящих произвольные
натуральные числа. Генераторы работают с разной скоростью.
Генерируемые даные поступают на вход системы посредством вызова 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).

About

Chain detection test appliacation


Languages

Language:Erlang 100.0%