[Python] web2py: lo conoscete -> sessioni su db

Daniele Varrazzo piro a develer.com
Lun 12 Dic 2011 23:13:48 CET


On Mon, 12 Dec 2011 18:49:38 +0100, Alessandro Dentella wrote:
> On Fri, Dec 02, 2011 at 03:37:34PM +0000, Daniele Varrazzo wrote:
>> Ah, cherrypy è multithread, ma lo storage su file delle sessioni non
>> è thread safe, me lo sono dovuto scrivere io. Mi chiedevo come mai
>> l'autore originale del programma usasse memcached solo per salvare
>> (si fa per dire le sessioni). Quando abbiamo fatto il multi-nodo, un
>> mio collega ha visto lo storage delle sessioni su database (che
>> potrebbe servirci se volessimo scalare su diverse macchine) e ha
>> detto che anche quello è finto.
>
> Nel cammino verso l'indipendenza dell'applicativo dal processo voglio
> portare le sessioni su database.

Uhm... ok... su file non vanno più bene? Assumo che lo vogliate fare 
per scalare oltre la singola macchina, altrimenti non c'è ragione.


> Considerando che attualmente le singole request vengono evase in 100 
> ms
> circa, pensavo di farlo utilizzando SELECT FOR UPDATE, così da 
> garantirmi
> che nessun'altra request possa leggere finché non ho evaso la 
> request.

E perché vorresti impedire di leggere? Uno fa tanto per progettare un 
database che consenta letture e scritture concorrenti e tu infili gli un 
ombrello nella ruota davanti? :)


> Ci sono idee migliori o controindicazioni? (a parte che tengo 
> occupata una
> connessione solo per questa transazione)

Controindicazioni dei lock espliciti? Quante ne vuoi. Non è una buona 
idea. Sono pochi i problemi che hanno davvero bisogno di un lock per 
essere risolti, e tu non sei neanche sicuro di avere un problema: ti 
direi lascia perdere che rischi di fare più danni di quelli di cui hai 
bisogno.


> Guadando il codice di django non ci leggo precauzioni contro questa
> eventualità, mi sfuggono o cherry-py non è solo?

Forse semplicemente non è un problema. Se hai un burst di letture sullo 
stesso utente dovuto a richieste asincrone, dovrebbero leggere tutte uno 
stato consistente della sessione. I problemi di cherrypy sono 
ridicolamente altri, secondo me django due o tre persone l'hanno testato 
e va bene così com'è. Con cherrypy a volte le sessioni leggevano un file 
e lo trovavano vuoto perché la richiesta di prima l'aveva aperto per 
scrivere (con open(name, 'w')) e non l'aveva ancora chiuso; con postgres 
questo problema non esiste: o il vecchio, o il nuovo, ma un record 
consistente ce lo trovi. Le sessioni su postgres di cherrypy erano finte 
perché mancavano dei metodi che servivano, proprio pezzi non scritti e 
oggetti mai usati, non avevano problemi di concorrenza. Di esistenza, 
casomai.

A proposito, poi com'è andata con la storia di tornado e psycopg?


-- 
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com


Maggiori informazioni sulla lista Python