Реалізувати алгоритм обмеження пропускної здатності каналу в рамках Erlang додатку
token_bucket
.
Для збірки та запуску проекта використовувати erlang.mk
.
Додаток повинен використовувати ETS
.
Модуль token_bucket
повинен експортувати дві функції: is_limit_reached/1,2
.
Плюсом буде покриття коду тестами (з використанням CT
).
Ціль тестового завдання: подивитись на стиль та підходи в програмуванні.
Ручне тестування функціоналу буде виглядати так:
$ cd token_bucket
$ make run
1> token_bucket:is_limit_reached(123).
false.
2> [token_bucket:is_limit_reached(123) _ <- lists:seq(1,5)].
[false,false,false,true,true]
3> [token_bucket:is_limit_reached(123, 4) _ <- lists:seq(1,5)].
[false,false,false,false,true]
4> [token_bucket:is_limit_reached(123, infinity) || _ <- lists:seq(1,5)].
[false,false,false,false,false]
Запуск тестів:
$ cd token_bucket
$ make ct
Допишіть логіку в модуль, котрий приведено нижче.
Зверніть увагу, що в тестовому завданні немає вимоги реалізувати очистку кеша в ETS.
Рішення, реалізовувати очистку кеша, чи ні - залишається за Вами.
Однак покриття тестами бажане: чим краще Ви оформите тестове завдання, тим вищою буде оцінка вашого коду.
-module(token_bucket).
-export([
is_limit_reached/1,
is_limit_reached/2
]).
-define(DEFAULT_RPS, 3).
-type user_id() :: pos_integer().
-type max_rps() :: pos_integer() | infinity.
-spec is_limit_reached(user_id()) -> boolean().
is_limit_reached(UserId) ->
is_limit_reached(UserId, ?DEFAULT_RPS).
-spec is_limit_reached(user_id(), max_rps()) -> boolean().
is_limit_reached(_UserId, _MaxRps) ->
{error, not_implemented}.
...
erl 23.3.4.5