Questa è una versione molto semplificata del problema:
Hai un intero salvato su un server chiamato "B" e hai uno script salvato su una chiamata al server "A" esposta a Internet. Lo script estrae il numero intero dal server B, ne aggiunge uno e quindi aggiorna il numero intero remoto. Nessuna di queste operazioni è atomica, il pull, l'aggiunta e l'aggiornamento, tutti hanno una latenza casuale.
Se c'è un solo utente che chiama lo script in sequenza, non ci saranno problemi e l'int verrà incrementato in modo coerente. Tuttavia, poiché lo script è esposto a Internet, può essere chiamato in parallelo da più utenti contemporaneamente, quindi mentre un'istanza dello script incrementerà il valore localmente prima di aggiornarlo da remoto, un altro estrarrà il valore effettivo dal server remoto, incrementando una vecchia versione di esso.
La mia soluzione è usare una coda (o almeno provare); Quindi, invece di chiamare lo script, gli utenti chiameranno un altro script che scriverà su un DB la richiesta di esecuzione (un messaggio; "per favore chiama script.php"). Dato che la scrittura nel DB non è atomica, sto anche scrivendo il microtime del server, quindi più tardi posso ordinare le richieste di esecuzione. Un terzo script, di solito chiamato call worker, interrogherà il DB per questi messaggi ed elaborerà la richiesta.
Il problema che ho è la maggior parte delle attuali soluzioni di coda Web chiama il lavoratore ogni volta che ne ha bisogno, perché non gli interessa l'ordine, vogliono solo fare un lavoro sincrono, asincrono in modo che il sito possa essere più veloce . Non riesco a chiamare lo script di lavoro ogni volta che arriva una nuova richiesta poiché il problema persisterà, due o più lavoratori possono essere istanziati allo stesso tempo a incasinare i calcoli. Posso mettere il lavoratore in un cronjob per pranzare ogni 60 secondi, ma sarà lento per i miei bisogni. Posso anche solo inserire un ciclo while all'interno del worker che interroga il DB a tempo indefinito ma che mi sembra inefficiente, o forse questo è effettivamente il modo in cui funziona la coda? solo un po 'di tempo che cicla fino alla fine dei tempi con forse un sonno su di esso ... Cosa ne pensi?