Il 10 marzo 2010 17.04, Luca G. Soave [email protected] ha scritto:
Grazie a Pietro e Alessandro x le info.
Mi pare di capire che sia periodically_call_remote che
Ajax.PeriodicalUpdater siano metodi “attivi” di polling, per cosi’ dire.
Non esiste, che voi sappiate, un Observer di ActiveRecord in grado di
mandare una callback per una data commit sul DB (.save)? Oppure una cosa
tipo after_create() di ActiveRecord::Callbacks che scatena un evento
ajax?
Come ti hanno già detto, no, non si può. Alcune applicazioni web
implementano eventi push tenendo aperto un socket (java o flash) ma, a
parte il fatto di avere una dipendenza in più, non credere che, per il
server, mantenere (potenzialmente) migliaia di connessioni aperte sia
un carico trascurabile.
Altre applicazioni simulano un evento push “trattenendo” le risposte a
eventi poll, ma è una cosa ancora più complicata e pesante per il
server.
La cosa più semplice e leggera è appunto quella suggeritati (vedi sotto).
Sto solo immaginando, perche’ non ho esperienza in questi metodi.
Il problema e’ che dentro il partial,
./app/views/home/_flits_list.html.erb c’e diversa roba, tra qui una
query al db <%= h flit.message %> che verrebbe eseguita nel mio caso
ogni 2 secondi x tutto il periodo in cui il browser utente rimane aperto
sulla pagina, moltiplicato x tutti gli utenti collegati nell’unita’ di
tempo … poco scalabile credo.
Ecco, qui c’è un problema grossissimo, indipendentemente da ajax e
quant’altro: le view non devono fare query. Le view devono solo
mostrare, nient’altro.
Poi, c’è un altro problema, e cioè che il partial è complesso. E anche
stavolta, questo è un problema indipendentemente da ajax.
Semplicemente, scomponi il partial in pezzi più piccoli, e uno di
questi pezzi si limiterà a mostrare la lista.
una query che verrebbe eseguita nel mio caso ogni 2 secondi
Due secondi mi sembra un’esagerazione, in genere cinque (o anche
dieci) secondi vanno più che bene; sei proprio sicuro che sia
indispensabile? Molte applicazioni mostrano una buona reattività pur
tenendosi appunto intorno ai dieci secondi e oltre.
Se ripetere tante volte la stessa query è davvero un problema, ci sono
tecnologie ad hoc per la persistenza dello stato (che in questo caso è
nuovi post sì / nuovi post no), come ti ha suggerito Andrea, che però
ha senso indagare solo se è vera almeno una delle due ipotesi:
a) hai già centinaia di utenti prenotati che terranno aperto il
browser sulla tua applicazione (ma questo probabilmente significa che
hai bisogno di una certa infrastruttura, ad esempio una banda “seria”
e un server come si deve);
b) hai voglia di imparare a usare redis
Tra l’altro, come dicevo nell’email precedente, usare una chiamata
ajax che ridisegni migliaia di volte la stessa identica lista è uno
spreco enorme, ed è un carico sia per il server (che finché non
finisce di trasmettere una risposta resta impegnato, ed ha così minore
capacità di risposta per gli altri) che per il client, e l’utente si
ritroverebbe un computer inchiodato da un browser che ridisegna lo
stesso pezzo di pagina; anche l’effetto visivo non è il massimo,
perché lo sfarfallìo si vede.
Ma questo non è necessario: quando mostri la pagina passi al
javascript l’ora corrente (lato server), così il javascript può
interrogare il server chiedendo: è cambiato niente dall’ora X? Se la
risposta è no, non fai niente; se è sì, si ridisegna la pagina.
pietro