Advertisement
IvanIvanoff

Untitled

May 14th, 2018
340
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.81 KB | None | 0 0
  1. Дойде време и за второто домашно.
  2.  
  3. TODO: Да се допише добавяне на два behaviour-a (не е best solution, но е най-лесен за описване и имплементиране) за `Publisher` и за `Subscriber` и как работят с EventBus-a
  4.  
  5. ## EventBus
  6.  
  7. EventBus имплементира `publisher/subscriber` архитектура. Той ни позволява да намалим свързаността (coupling) на отделните компоненти в програмата. Тези отделни компоненти не е нужно да знаят един за друг, за да работят заедно - трябва само да познават `EventBus`-а.
  8. Всеки `subscriber` се регистрира за специфични `event`-и и е нотифициран, когато те се случат.
  9. Всеки `publisher` публикува `event`-и в `EventBus`-а, който се грижи всеки `subscriber` да бъде нотифициран когато е нужно.
  10.  
  11. **EventBus** е модул, който има следните функции:
  12.  
  13. `start_link/{0,1}` - Стартира нов `EventBus` процес и връща `{:ok, pid}` или `{:error, reason}`.
  14. Функцията може да приеме 0 или 1 един аргумент. В случая на 1 арумент това е променлива, съдържаща името на процеса (т.е. той ще бъде именуван).
  15.  
  16. `add_event_type/1`-
  17. Приема единствен аргумент (всякакъв терм), който уникално идентифицира даден `event`, наример `:question`, `"someEvent"`, `{:event_type_8, :elixir}`. Добавя въпросния `event type` към списъка (вътрешното представяне в процеса не е нужно да е списък) с регистрирани `event types`, с които този `EventBus` работи. A
  18.  
  19. `event_types/0` - Връща списък с всички `event types`, които са регистрирани чрез `add_event_type/1`.
  20.  
  21. `subscribe/2` - Приема аргументи `mod` и списък от `event type`. Стартира процес с `mod` като `callback module` така, че да бъде нотифициран за всички `event type` събития от дадения списък. Трябва поне един `event type` от списъка да е регистриран в `EventBus`-a.
  22.  
  23. `subscribers/0` - Връща списък с двойки във вида `pid` на всички регистрирали се за получаване на събития процеси.
  24.  
  25. `publish/{2-3}` - Приема аргументи `event_type`, `message` и `cast_type`, който има стойност по подразбиране `:broadcast`. `cast_type` определя по какъв начин ще бъдат нотифициран всеки `subscriber`.
  26.  
  27. * `cast_type = :monocast` - `subscriber`-ите ще бъдат нотифицирани един по един като изчакваме всеки да завърши обработката на събитието.
  28.  
  29. * `cast_type = :broadcast` - Всички `subscriber`-и ще бъдат нотифицирани едновременно без да се чакаме някой да завърши, за да изпратим събитието към следващия.
  30.  
  31. Ако някой от `subscriber` процесите умре, то той трябва да бъде рестартиран. Ако някой `subscriber` умре повече от 10 пъти за 5 секунди, то той представа да се рестартира автоматично. Когато това се случи с един `subscriber`, то работата на другите не трябва да бъде прекъсвана.
  32.  
  33. Вътрешното устройство на процесите, начинa по който се изпращат съобщенията и тяхната форма оставяме на вас.
  34. Важно изискване е да използвате OTP поведенията.
  35.  
  36. Пример как бихме тествали вашия код:
  37. 1. Инициализация на EventBus
  38. 2. Добавяне на събитие `:foo`
  39. 3. Създаваме `subscriber`, който се регистрира за събития `:foo`. Когато бъде нотифициран за постъпването на такова събитие, то той изпраща към себе си съобщение във вида `{:foo, message}`, където `message` е съобщенията изпратено с `publish`
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement