![]() |
3 years ago | |
---|---|---|
apps | 3 years ago | |
.gitignore | 3 years ago | |
Emakefile | 3 years ago | |
Makefile | 3 years ago | |
README.md | 3 years ago | |
sys.config | 3 years ago | |
vm.args | 3 years ago |
Реализовать приложение для вызова событий по времени.
Приложение должно работать с относительной и абсолютной величинами таймингов
Приложение должно иметь протокол:
При приеме нового события с одним и тем же (ID задачи, ID процесса) прошлый нужно перезатирать.
При удалении события вызываться при срабатывании time оно уже не должно.
Общение с основным приложением будет на уровне очереди(rabbitMQ),
при срабатывании события необходимо бросить в очередь rabbitMQ событие
(в спецификации очереди есть параметр reply-to, который укажет в какую очередь отправить ответ),
куда включить ID задачи и ID процесса (для примера {call_timer, ProcID, TaskID}).
Для экономии памяти необходима гибридная схема:
храним N задач по процессу, остальное в базе.
Когда очередь задач по процессу иссякла, идем в базу и набираем еще порцию данных.
Для уменьшения запросов в БД необходимо агрегировать запросы в базу
(чтобы не случилось так, что 1000 обработчиков захотели получить данные в единицу времени).
Приложение должно с легкостью управляться с нагрузкой -
20тысяч приемов новых заявок и 20 тысяч удалений в секунду одновременно.
Время срабатывания события критично до секунды.
Выполнять задание в репозитории типа github. Использовать тесты.
Задание можно полностью не сделать. Важен подход и оформление кода.
Q: тобто в одну секунду йдуть і 20k нових, і ще 20k видалення існуючих?
просто 20k нових та 20k спрацювань не рахується?
A: приходят заявки на выполнение через 5 секунд, часть из них отменяется ( удаление )
получается да, одновременно
$ 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
% gen_server:cast add/delete
(myapp@127.0.0.1)2> test:testn(300).
ok
57
59
57
57
48
58
62
41
61
49
44
52
47
64
53
48
42
51
59
58
47
44
60
58
52
60
...
"the end"
% gen_server:call add/delete
(myapp@127.0.0.1)3> test:testn_b(300).
ok
238
236
221
282
236
224
228
234
357
228
356
235
228
225
224
237
232
236
239
233
243
247
258
247
...
"the end"
(myapp@127.0.0.1)1> test:testn_b(30).
count before: 0
ok
count after: 10000
308 milliseconds
==========================================
count before: 10000
count after: 20000
310 milliseconds
==========================================
count before: 20000
count after: 20000
320 milliseconds
==========================================
count before: 20000
count after: 20000
323 milliseconds
==========================================
count before: 20000
count after: 20000
328 milliseconds
==========================================
count before: 20000
count after: 20000
507 milliseconds
==========================================
count before: 20000
count after: 20000
428 milliseconds
==========================================
count before: 20000
count after: 20000
315 milliseconds
==========================================
count before: 20000
count after: 20000
314 milliseconds
==========================================
count before: 20000
count after: 20000
505 milliseconds
==========================================
count before: 20000
count after: 20000
317 milliseconds
==========================================
count before: 20000
count after: 20000
330 milliseconds
==========================================
count before: 20000
count after: 20000
327 milliseconds
==========================================
count before: 20000
count after: 20000
327 milliseconds
==========================================
count before: 20000
count after: 20000
335 milliseconds
==========================================
count before: 20000
count after: 20000
329 milliseconds
==========================================
count before: 20000
count after: 20000
316 milliseconds
==========================================
count before: 20000
count after: 20000
365 milliseconds
==========================================
count before: 20000
count after: 20000
313 milliseconds
==========================================
count before: 20000
count after: 20000
320 milliseconds
==========================================
count before: 20000
count after: 20000
361 milliseconds
==========================================
count before: 20000
count after: 20000
338 milliseconds
==========================================
count before: 20000
count after: 20000
352 milliseconds
==========================================
count before: 20000
count after: 20000
321 milliseconds
==========================================
count before: 20000
count after: 20000
314 milliseconds
==========================================
count before: 20000
count after: 20000
358 milliseconds
==========================================
count before: 20000
count after: 20000
324 milliseconds
==========================================
count before: 20000
count after: 20000
347 milliseconds
==========================================
count before: 20000
count after: 20000
315 milliseconds
==========================================
count before: 20000
count after: 20000
322 milliseconds
==========================================
"the end"
result count: 0
(myapp@127.0.0.1)2> myapp_events2:check_ets_count2().
0
(myapp@127.0.0.1)3> myapp_events2:check_ets_count().
0