Wzór "Szyna zdarzeń" (Event Bus) to podejście architektoniczne, które umożliwia komunikację między komponentami systemu poprzez publikację i nasłuchiwanie zdarzeń. Komponenty nie wiedzą o sobie nawzajem bezpośrednio, następuje luźne powiązanie w oparciu o zasadę "wydawca-subskrybent".
Zastosowanie: Ten wzór jest przydatny tam, gdzie konieczne jest zapewnienie skalowalnej, rozszerzalnej interakcji między wieloma modułami — na przykład w złożonych aplikacjach webowych, systemach desktopowych, platformach mikroserwisowych.
Przykład kodu w Pythonie z użyciem biblioteki pyee:
from pyee import EventEmitter bus = EventEmitter() def on_user_created(user): print(f"Utworzono użytkownika: {user}") bus.on('user_created', on_user_created) bus.emit('user_created', {"id": 1, "name": "Iwan"})
Kluczowe cechy:
Czy wszystkie zdarzenia w Event Bus powinny być trwałe?
Nie, niekoniecznie. W większości przypadków Event Bus operuje na ephemerznych (ulotnych) zdarzeniach, które nie są przechowywane. Trwałość jest potrzebna tylko wtedy, gdy istotna jest niemożność utraty zdarzeń (na przykład przez Kafka).
Czy zdarzenie zostanie utracone, jeśli żaden subskrybent nie jest zarejestrowany w momencie publikacji?
Tak, jeśli system nie przechowuje zdarzeń (ephemericznych), to zdarzenie zostanie utracone. Aby zapewnić gwarantowaną dostawę, potrzebny jest trwały Event Bus (na przykład RabbitMQ z trwałymi kolejkami).
Czy można używać jednego Event Bus dla kodów synchronicznych i asynchronicznych bez ograniczeń?
Nie, synchroniczny Event Bus może blokować wątek do zakończenia wszystkich obsługujących, co jest nieakceptowalne przy dużym obciążeniu. Dla systemów skalowalnych stosuje się asynchroniczne Event Bus lub przenosi się przetwarzanie zdarzeń do osobnych procesów/wątków (na przykład przez Celery).