Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Дойде време и за второто домашно.
- TODO: Да се допише добавяне на два behaviour-a (не е best solution, но е най-лесен за описване и имплементиране) за `Publisher` и за `Subscriber` и как работят с EventBus-a
- ## EventBus
- EventBus имплементира `publisher/subscriber` архитектура. Той ни позволява да намалим свързаността (coupling) на отделните компоненти в програмата. Тези отделни компоненти не е нужно да знаят един за друг, за да работят заедно - трябва само да познават `EventBus`-а.
- Всеки `subscriber` се регистрира за специфични `event`-и и е нотифициран, когато те се случат.
- Всеки `publisher` публикува `event`-и в `EventBus`-а, който се грижи всеки `subscriber` да бъде нотифициран когато е нужно.
- **EventBus** е модул, който има следните функции:
- `start_link/{0,1}` - Стартира нов `EventBus` процес и връща `{:ok, pid}` или `{:error, reason}`.
- Функцията може да приеме 0 или 1 един аргумент. В случая на 1 арумент това е променлива, съдържаща името на процеса (т.е. той ще бъде именуван).
- `add_event_type/1`-
- Приема единствен аргумент (всякакъв терм), който уникално идентифицира даден `event`, наример `:question`, `"someEvent"`, `{:event_type_8, :elixir}`. Добавя въпросния `event type` към списъка (вътрешното представяне в процеса не е нужно да е списък) с регистрирани `event types`, с които този `EventBus` работи. A
- `event_types/0` - Връща списък с всички `event types`, които са регистрирани чрез `add_event_type/1`.
- `subscribe/2` - Приема аргументи `mod` и списък от `event type`. Стартира процес с `mod` като `callback module` така, че да бъде нотифициран за всички `event type` събития от дадения списък. Трябва поне един `event type` от списъка да е регистриран в `EventBus`-a.
- `subscribers/0` - Връща списък с двойки във вида `pid` на всички регистрирали се за получаване на събития процеси.
- `publish/{2-3}` - Приема аргументи `event_type`, `message` и `cast_type`, който има стойност по подразбиране `:broadcast`. `cast_type` определя по какъв начин ще бъдат нотифициран всеки `subscriber`.
- * `cast_type = :monocast` - `subscriber`-ите ще бъдат нотифицирани един по един като изчакваме всеки да завърши обработката на събитието.
- * `cast_type = :broadcast` - Всички `subscriber`-и ще бъдат нотифицирани едновременно без да се чакаме някой да завърши, за да изпратим събитието към следващия.
- Ако някой от `subscriber` процесите умре, то той трябва да бъде рестартиран. Ако някой `subscriber` умре повече от 10 пъти за 5 секунди, то той представа да се рестартира автоматично. Когато това се случи с един `subscriber`, то работата на другите не трябва да бъде прекъсвана.
- Вътрешното устройство на процесите, начинa по който се изпращат съобщенията и тяхната форма оставяме на вас.
- Важно изискване е да използвате OTP поведенията.
- Пример как бихме тествали вашия код:
- 1. Инициализация на EventBus
- 2. Добавяне на събитие `:foo`
- 3. Създаваме `subscriber`, който се регистрира за събития `:foo`. Когато бъде нотифициран за постъпването на такова събитие, то той изпраща към себе си съобщение във вида `{:foo, message}`, където `message` е съобщенията изпратено с `publish`
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement