Via G. Falcone 5, Pollenza (MC), Italy
+39 0733 203595

Come rendere fault-tolerant SncRedisBundle

Capita di voler utilizzare Redis per memorizzare informazioni non fondamentali o che possono essere rigenerate anche nel caso non fossero accessibili.
In questi casi se il server Redis dovesse non essere disponibile per un qualsiasi problema, il nostro servizio sarebbe completamente interrotto pur essendo funzionanti tutti i sistemi necessari ad erogarlo.
Questo perché un errore di connessione al server Redis utilizzando SncRedisBundle genera un’eccezione in fase di bootstrap di Symfony impedendo la generazione di qualsiasi pagina.

In questi casi è possibile definire un client “opzionale” che non generi un errore nel caso di risulti impossibile connettersi al server Redis ma che, rilevata tale condizione, la notifichi al codice dello strato superiore permettendo di gestire un fallback senza interrompere il servizio.

Per far ciò basta definire una classe wrapper (decorator) per il client, che catturi un’eventuale eccezione in fase di connessione ed esponga tramite un flag lo stato della connessione stessa:

Fatto questo possiamo, tramite un CompilerPass, sostituire la classe del client con quella appena definita in tutti i servizi taggati come “snc_redis.client”.

Aggiungiamo quindi il nostro nuovo CompilerPass al metodo build() del nostro bundle o del kernel per Symfony 4+:

Adesso anche quando il server Redis non è attivo Symfony potrà fare il bootstrap correttamente e nell’utilizzo del nostro client potremo far affidamento sul flag isConnected() per comportarci di conseguenza.
Ad esempio:

Leave a reply


This site uses Akismet to reduce spam. Learn how your comment data is processed.