[Python] Non blocking http server e integrazione con database relazionali

Roberto De Ioris roberto a unbit.it
Ven 14 Mar 2014 08:26:32 CET


> Di recente ho letto un po di tornado, e in particolare mi sono soffermato
> sul modulo tornado.httpserver(Non-blocking HTTP server). Stando a quello
> che c'è scritto sulla documentazione ufficiale parla di "non-blocking,
> single-threaded HTTP server" e di risolvere il problemi di tipo C10K. Qua
> sembra interessante, anche se non ho la minima idea di come funzioni. Sono
> rimasto perplesso quando ho provato a cercare qualche ORM da usare con
> tornado e non ho trovato nulla. Dopo un po di ricerche, da quello che ho
> capito, un orm non è fatto per lavorare in maniera asincrona. E non ho
> neppure trovato una libreria per collegarsi a qualche tipo di database
> relazione(a parte quella con MySql ma sembra non più supportata).
>
> Detto questo, non riesco a capire l'utilità di un HTTP Server con
> performance elevatissime ma che non permetta una minima interazione con il
> database.
>
> Probabilmente sopra ho scritto delle cavolate ma mi mancano completamente
> le basi per questo tipo di argomenti e volevo capire meglio come
> funzionano
> e quali sono i campi di applicazione di tecnologie simili.
>


Non hai scritto cavolate, e anzi ti faccio i complimenti perche'
nonostante dichiari di non capire bene la materia in realta' ti sei
accorto del (secondo me) problema piu' grosso di tutte le tecnologie
non-blocking nel mondo python: sono vendute MALISSIMO, in modo quasi
dannoso.

Il paradigma non-blocking ha una semplice regola: o sei non-blocking al
100% oppure la tua app non funziona. punto. il 99.9999999% non e'
sufficiente. Una singola parte non bloccante ti manda l'app in malora.
(ovvio, si potrebbero non avere problemi per mesi, ma all'improvviso una
query resta bloccata e tutta l'app va giu'...)

Ad oggi ho fatto consulenza su quasi 200 app Django che giravano su
uWSGI+gevent o gunicorn+gevent. Di queste neanche il 10% erano corrette in
quanto la maggior parte usavano i db adapter standard, o si collegavano a
servizi esterni (come api http) usando moduli blocking e cosi' via.

Parliamo di quasi il 90% di utenti che stanno usando una tecnologia in
modo sbagliato e che continuano a pubblicizzare il loro "successo" con
gevent.

La stessa cosa succede con tornado, eventlet e sono sicuro che succedera'
con asyncio/tulip

Uno dei punti di forza di python (secondo me) e' la gigantesca
disponibilita' di moduli, e un utente medio si aspetta di poter continuare
a usarli tutti senza problemi, soprattutto se NON gli comunichi a
caratteri cubitali tutte le implicazioni del non-blocking (e invece gli
porti solo i vantaggi)

Detto questo, ci sono comunque diversi moduli
async-friendly/tornado-friendly ma sono spesso "progettini", a volte
sviluppati senza l'attenzione necessaria ad un modulo db-adapter (vedere
il lavoro titanico che c'e' dietro a psycopg2, che per la cronaca puo'
essere adattato al non-blocking)

In conclusione, se sei fortunato troverai un adapter per il tuo db che
funziona con tornado, ma dovrai tenere a mente che ogni volta che
introduci una funzionalita' questa dovra' cooperare con il resto del
sistema.


-- 
Roberto De Ioris
http://unbit.it


Maggiori informazioni sulla lista Python