Sto lavorando su un'API REST per un servizio Web utilizzando Pyramid e Cornice; i dati sul lato server vengono gestiti utilizzando SQLAlchemy e MySQL. Il server Web è nginx utilizzando uwsgi, ed è configurato per l'esecuzione più processi Python:API REST Pyramid: come posso gestire in modo sicuro l'accesso simultaneo ai dati?
[uwsgi]
socket = localhost:6542
plugins = python34
...
processes = 2 # spawn the specified number of workers/processes
threads = 2 # run each worker in prethreaded mode with the specified number of threads
Problema
Supponiamo che un tavolo customers
sul lato server. Utilizzando l'API è possibile leggere i dati dei clienti, modificarli o eliminarli. In aggiunta a ciò ci sono altre funzioni API che leggono i dati dei clienti.
ho potuto emettere chiamate API multipli contemporaneamente che poi competono per la stessa risorsa cliente:
# Write/modify the customer {id} data
curl --request POST ... https://some.host/api/customer/{id}
# Delete customer {id} and all of its associated data
curl --request DELETE https://some.host/api/customer/{id}
# Perform some function which reads customer {id}
curl --request GET ... https://some.host/api/do-work
Essenzialmente questo è un Readers-Writers Problem, ma perché più di un processo è coinvolto, la sincronizzazione tradizionale filo utilizzando locks/mutexes/semaphores non funzionerà qui.
Domanda
Vorrei capire il modo migliore per attuare il bloccaggio e sincronizzazione per tale API web basato piramide, tale che le chiamate simultanee, come nell'esempio di cui sopra sono gestite in modo sicuro ed efficiente (cioè senza serializzazione non necessaria).
Solutions (?)
- Non credo abbia senso per marcare/bandiera cliente
{id}
comelocked
perché SQLAlchemy memorizza nella cache tali modifiche, eflush()
non sembra sufficiente atomica in questo contesto? - This article descrive l'utilizzo di HTTP ETag per gestire le risorse condivise.
- Uno potrebbe anche utilizzare Redis come distributed lock manager per uno spinlock per avvolgere una funzione di visualizzazione?
- E a proposito di Pyramid transaction manager?
Grazie! WRT SQLAlchemy, [questa risposta] (http://stackoverflow.com/questions/21653319/sqlalchemy-concurrency-update-issue#21695216) sembra essere una soluzione praticabile. Basta trovare un modo per integrarlo con la gestione della sessione di Pyramid. – Jens