Ibexa DXP

La pubblicazione di contenuti con eZ Publish su siti ad alto traffico

Se dovete realizzare nuove soluzioni digitali ad alto traffico o comunque critiche per il business, assicuratevi di utilizzare alla base tecnologie che consentano di essere configurate e sviluppate appropriatamente per scalare quando necessario.

Non fatevi intrappolare da strumenti che seppur molto noti e diffusi pongono seri limiti alla crescita e comportano tempi e costi elevati per essere adattati.

Ad esempio, il CMS eZ Publish contiene funzionalità avanzate che possono essere attivate in tempi rapidi come la pubblicazione asincrona.

E’ vero che sono richiesti degli specialisti per governare simili tecnologie ma i benefici per il business sono molto elevati.

A cosa serve la pubblicazione asincrona di eZ Publish?

Nei siti ad alto traffico la pubblicazione in eZ Publish può essere una nota dolente: diverse pubblicazioni avviate in contemporanea o semplicemente in uno stato di traffico elevato potrebbero causare tempi di comunicazione con il database prolungati finendo, ad esempio, in errori 50x o i famigerati Transaction Error di eZ Publish restituiti al backend mentre gli editor desidererebbero pubblicare il proprio articolo.

Il motivo di ciò è che la pubblicazione è un’operazione che avviene in una singola transazione, richiedendo la modifica di diversi record nei quali sono legati nodi agli oggetti di contenuto, l’alberatura dei contenuti, classi di contenuto e così via.

Durante tale transazione le tabelle vengono mantenute in lock perciò altre transazioni che richiedono accesso alle stesse tabelle saranno in attesa di unlock da parte di essa: se l’attesa supera quanto impostato (in lock_wait_timeout per MySQL) le altre transazioni falliranno e ne verrà eseguito il rollback.

Inoltre è da considerare che durante una singola transazione possono essere eseguite anche operazioni come la copia delle immagini, l’indicizzazione dei contenuti nel motore di ricerca, la pulizia delle varie cache di eZ Publish, ecc., perciò più transazioni vengono eseguite in contemporanea più tempo ogni singola transazione richiederà e questo sfocerà come si può intuire in una problematica grave in modo particolare in siti ad alto traffico.

A prima vista la tentazione potrebbe essere quella di risolvere il problema meramente per via sistemistica aumentando il lock wait timeout del database, tuttavia questo in realtà non fa altro che ingrandire la dimensione degli effetti indesiderati. Nel caso di eZ Publish è preferibile procedere per via applicativa poiché come soluzione a ciò eZ Publish mette a disposizione la funzionalità di pubblicazione asincrona che consiste in una gestione della pubblicazione attraverso una coda FIFO eseguita in background.

Nel momento in cui l’editor richiederà una pubblicazione essa verrà aggiunta alla coda e l’utente rimarrà aggiornato sullo stato in tempo reale e notificato al completamento dell’operazione riducendo così i lunghi tempi di attesa e permettendogli al contempo di eseguire altre operazioni.

Come abilitare e configurare la pubblicazione asincrona su eZ Publish

Di default la pubblicazione asincrona è disabilitata, è necessario perciò definire un override di tali settings del content.ini:

[PublishingSettings]AsynchronousPublishing=enabled

E’ da tenere in considerazione che è possibile definire il numero di pubblicazioni che il demone deve processare in concorrenza:

[PublishingSettings]PublishingProcessSlots=10

Di conseguenza impostando tale parametro a 1 si arriverà ad avere una gestione completamente in serie, questo significa tuttavia che in vari casi gli editor dovranno aspettare più tempo per la conferma di avvenuta pubblicazione.

eZ Publish mette a disposizione inoltre dei filtri per delle eccezioni: ogni filtro può essere definito come una classe PHP e verrà chiamato in sequenza accettando o rifiutando l’oggetto, che nel secondo caso verrà processato in modalità sincrona.

Come configurare il demone di pubblicazione

Chi gestisce la coda in prima persona è il demone in ascolto ezasynchronouspublisher.php che come principio base deve essere uno per database e di cui va configurato il servizio sulla macchina che ospita l’installazione/i di eZ Publish.

E’ possibile avviarlo manualmente in background:

php bin/php/ezasynchronouspublisher.php -n

eZ Publish mette a disposizione un piccolo servizio per gestire il demone: si può perciò inserirlo tra gli script da avviare al boot (nell’esempio in una distribuzione Debian):

cd /etc/init.d && ln -s /path/to/ezpublish/bin/startup/debian/ezasynchronouspublisher && chmod +x ezasynchronouspublisher

Tramite questo servizio il demone può essere avviato:

/etc/init.d/ezasynchronouspublisher start

E configurato per essere eseguito al boot:

chkconfig ezasynchronouspublisher on

Infine per conoscere tutte le opzioni disponibili del demone:

/etc/init.d/ezasynchronouspublisher help

Come tenere monitorata la coda

Nel particolare la vista content/queued.tpl disponibile nel backend e per la quale è possibile definirne un override, rimane aggiornata attraverso AJAX dalla tabella ezpublishingqueueprocesses dove vengono memorizzate diverse informazioni tra cui la versione dell’oggetto da pubblicare e lo stato di pubblicazione.

E’ perciò possibile monitorare la coda ignorando gli oggetti in stato di pubblicato:

select * from ezpublishingqueueprocesses where status != 2;

Gli stati più importanti da considerare sono lo stato 1 che indica lo stato di processamento da parte del demone di pubblicazione e lo stato 3 che indica che la pubblicazione è ancora da processare.

Ai fini di risoluzione di problemi è fondamentale verificare che il demone di pubblicazione sia in esecuzione.

Queste sono tutte le informazioni principali per quanto riguarda la pubblicazione asincrona di eZ Publish, per tutto il resto è possibile consultare comunque la documentazione ufficiale.

Conclusione

Come avete potuto leggere, è importante scegliere gli strumenti giusti che possono fare la differenza in progetti digitali di rilievo, ed è altrettanto importante affidarsi a professionisti specializzati nel costruirli e gestirli.