La persistència de tasques és la propietat d'un sistema de cues de treball que garanteix que les tasques pendents no es perdin en cas de fallada, reinici o aturada de l'aplicació. Un sistema de cues persistent emmagatzema les tasques en un suport durador, com ara un disc o una base de dades, en lloc de mantenir-les únicament en memòria volàtil.
Motivació En arquitectures basades en cues de treball, els productors afegeixen tasques a la cua i els consumidors les processen. Si l'aplicació cau o es reinicia mentre hi ha tasques pendents a la cua i aquesta és volàtil (en memòria), totes les tasques no processades es perden. En entorns de producció, on les tasques poden representar operacions crítiques com transaccions econòmiques, enviaments de correus o actualitzacions de bases de dades, aquesta pèrdua és inacceptable.
La persistència de tasques resol aquest problema garantint que cada tasca quedi registrada en un suport estable abans de ser processada i que el sistema pugui reprendre el treball pendent en cas de recuperació d'una fallada.
Implementació Les cues d'asyncio de Python (asyncio.Queue) no ofereixen persistència: viuen en la memòria RAM del procés i desapareixen si el procés s'atura. Per a sistemes que requereixen persistència, cal recórrer a solucions externes especialitzades:
RabbitMQ: missatger de cues que permet declarar cues durables que sobreviuen a reinicis del servidor, emmagatzemant els missatges en disc. Celery: marc de treball distribuït per a tasques en segon pla que admet múltiples brokers (RabbitMQ, Redis) i garanteix el lliurament de tasques fins i tot davant fallades de treballadors. Redis (amb persistència activada): emmagatzematge en memòria que opcionalment pot persistir dades en disc, tot i que amb menys garanties que RabbitMQ.
Relació amb la idempotència En sistemes amb persistència de tasques, una tasca pot ser executada més d'una vegada si el treballador falla just abans de confirmar que l'ha completada. Per aquest motiu, les tasques persistents han de ser idempotents, és a dir, l'efecte d'executar-les diverses vegades ha de ser el mateix que executar-les una sola vegada.
Vegeu també Cua de missatges Idempotència RabbitMQ
Referències
Fowler, M. (2022). Python Concurrency with asyncio. Manning Publications. Capítol 12, secció 12.1.1.