Il pattern "Event Bus" è un approccio architettonico che consente di realizzare comunicazione tra i componenti del sistema tramite la pubblicazione e l'ascolto di eventi. In questo modo, i componenti non conoscono direttamente l'uno dell'altro, avviene un'interazione debolmente accoppiata secondo il principio "pubblicatore-sottoscrittore".
Utilizzo: Questo pattern è utile dove è necessario garantire un'interazione scalabile e espandibile tra molti moduli, ad esempio, in applicazioni web complesse, sistemi desktop, piattaforme di microservizi.
Esempio di codice in Python utilizzando la libreria pyee:
from pyee import EventEmitter bus = EventEmitter() def on_user_created(user): print(f"Creato utente: {user}") bus.on('user_created', on_user_created) bus.emit('user_created', {"id": 1, "name": "Ivan"})
Caratteristiche principali:
Tutti gli eventi nel Event Bus devono essere persistenti?
No, non è necessario. Nella maggior parte dei casi, l'Event Bus opera su eventi ephemeral (volatili) che non vengono salvati. La persistenza è necessaria solo se è importante evitare la perdita di eventi (ad esempio, tramite Kafka).
Verrà perso un evento se nessun sottoscrittore è registrato al momento della pubblicazione?
Sì, se il sistema non salva gli eventi (ephemeral), allora l'evento andrà perso. Per una consegna garantita è necessario un Event Bus duraturo (ad esempio, RabbitMQ con code persistenti).
È possibile utilizzare un solo Event Bus per codice sincrono e asincrono senza limitazioni?
No, l'Event Bus sincrono può bloccare il thread fino al completamento di tutti gli handler, il che è inaccettabile per carichi elevati. Per sistemi scalabili si utilizzano Event Bus asincroni o si esternalizza l'elaborazione degli eventi in processi/thread separati (ad esempio, tramite Celery).