README.md 3.9 KB

erlang_test

Реализовать приложение для вызова событий по времени.

Приложение должно работать с относительной и абсолютной величинами таймингов

  1. Текущее время + относительная часть (например 30 сек)
  2. Абсолютная (сработать, например, 01.01.2016)

Приложение должно иметь протокол:

  1. для приема заявок. Входные параметры:
    • ID задачи (varchar)
    • ID процесса (integer)
    • тип(статика/динамика)
    • время(integer)
  2. для удаления событий. Входные параметры:
    • ID задачи (varchar)
    • ID процесса (integer)

При приеме нового события с одним и тем же (ID задачи, ID процесса) прошлый нужно перезатирать.
При удалении события вызываться при срабатывании time оно уже не должно.

Общение с основным приложением будет на уровне очереди(rabbitMQ),
при срабатывании события необходимо бросить в очередь rabbitMQ событие
(в спецификации очереди есть параметр reply-to, который укажет в какую очередь отправить ответ),
куда включить ID задачи и ID процесса (для примера {call_timer, ProcID, TaskID}).

Для экономии памяти необходима гибридная схема:
храним N задач по процессу, остальное в базе.
Когда очередь задач по процессу иссякла, идем в базу и набираем еще порцию данных.

Для уменьшения запросов в БД необходимо агрегировать запросы в базу
(чтобы не случилось так, что 1000 обработчиков захотели получить данные в единицу времени).

Приложение должно с легкостью управляться с нагрузкой -
20тысяч приемов новых заявок и 20 тысяч удалений в секунду одновременно.
Время срабатывания события критично до секунды.

Выполнять задание в репозитории типа github. Использовать тесты.

Задание можно полностью не сделать. Важен подход и оформление кода.


$ make
$ make start
ERL_LIBS="apps:deps" erl +pc unicode -args_file vm.args -config sys.config -eval 'application:start(myapp)'
Erlang/OTP 23 [erts-11.2.2.4] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:5] [hipe]

Eshell V11.2.2.4  (abort with ^G)
(myapp@127.0.0.1)1> test:test().
ok
(myapp@127.0.0.1)2> update: "12" 12
update: "13" 13
deleted: "9" 9
deleted: "14" 14
tick: "1" 1
tick: "3" 3
tick: "5" 5
tick: "7" 7
tick: "2" 2
tick: "4" 4
tick: "11" 11
tick: "6" 6
tick: "8" 8
tick: "15" 15
tick: "10" 10
tick: "12" 12
tick: "13" 13

(myapp@127.0.0.1)2> test:test2().
add/update: "2" 2
add/update: "4" 4
ok
add/update: "6" 6
(myapp@127.0.0.1)3> add/update: "8" 8
add/update: "10" 10
add/update: "12" 12
add/update: "14" 14
add/update: "1" 1
add/update: "3" 3
add/update: "5" 5
add/update: "7" 7
add/update: "9" 9
add/update: "11" 11
add/update: "13" 13
add/update: "15" 15
add/update: "12" 12
add/update: "13" 13
deleted: "9" 9
deleted: "14" 14
tick: "1" 1
tick: "3" 3
tick: "5" 5
tick: "2" 2
tick: "7" 7
tick: "4" 4
tick: "11" 11
tick: "6" 6
tick: "8" 8
tick: "10" 10
tick: "15" 15
tick: "12" 12
tick: "13" 13