sullo sviluppo di servizi Web con stato globale

3

Sono nuovo nella programmazione web. Sono più esperto e a mio agio con il codice lato client. Recentemente, mi sono dilettato nella programmazione web attraverso il Google App Engine di Python. Mi sono imbattuto in qualche difficoltà mentre cercavo di scrivere alcune semplici app a scopo di apprendimento, coinvolgendo principalmente come mantenere una sorta di stato coerente e universalmente accessibile per l'applicazione.

Ho provato a scrivere un semplice sistema di gestione delle code, il tipo che ti aspetteresti di usare in una piccola clinica o in una caffetteria. In genere, questo viene fatto con l'hardware. Prendi un numero da una biglietteria, e quando il tuo numero viene visualizzato o chiamato ti avvicini al contatore per il servizio. In alternativa, potresti ricevere un piccolo cercapersone, che emetterà un segnale acustico o vibrerà quando è il tuo turno di ricevere assistenza. Il primo è un po 'migliore in quanto hai un'idea di quante persone sono ancora in testa davanti a te.

In questa situazione, lo stato globale è l'ultimo numero in coda, che deve essere aggiornato ogni volta che viene effettuata una richiesta al server. Non sono sicuro del modo migliore per archiviare e mantenere questo valore in un contesto GAE.

La soluzione che ho pensato era di mantenere il valore nel Datastore, tentare di interrogarlo durante una richiesta di ticket, aggiornare il valore e quindi memorizzarlo nuovamente con put. Il mio problema è che non ho capito come bloccare la risorsa in modo che altre richieste non controllino il valore mentre è in corso di aggiornamento. Sono preoccupato che possa finire le richieste di biglietti con lo stesso numero di coda. Inoltre, l'intera soluzione mi sembra imbarazzante. Mi stavo chiedendo se ci fosse un modo più naturale per realizzare questo senza dover passare attraverso il Datastore.

Chiunque abbia più esperienza in questo dominio può fornire alcuni consigli su come affrontare la progettazione della suddetta applicazione?

    
posta user74418 05.12.2012 - 19:13
fonte

1 risposta

2
  • Ogni richiesta di ticket viene registrata in una tabella del database ticket che memorizza l'ID univoco della richiesta e l'ora in cui è stata effettuata la richiesta.
  • Ogni volta che è il momento di servire una nuova richiesta, recupera la prima riga dalla tabella del ticket database, ordinata per tempo della richiesta.
  • Elimina la riga dal database.

Se gli ultimi due passaggi vengono eseguiti come una singola transazione, sarai in grado di avere più agenti che soddisfano le richieste contemporaneamente senza calpestare le dita dei piedi degli altri.

Non sono sicuro di come funziona l'archivio dati di Google AppEngine, ma qualsiasi database decente dovrebbe darti:

  • ID automatici che sono garantiti come unici;
  • Query transazionali che possono bloccare le righe richieste da quella transazione.
risposta data 05.12.2012 - 19:49
fonte