Architekt systemówArchitekt backendu

Opisz wzór "Szyna zdarzeń" (Event Bus), gdzie go stosować i jakie pułapki należy wziąć pod uwagę?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

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:

  • Zwiększa modularność, ponieważ usługi komunikują się przez szynę, a nie bezpośrednio
  • Ułatwia dodawanie nowych obsługujących zdarzenia bez zmiany istniejącego kodu
  • Może prowadzić do trudnych do wyśledzenia błędów z powodu niejawnych zależności i trudności w śledzeniu przepływów biznesowych

Pytania z podtekstem.

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).