|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
[vari] Interazione tra utenti in un'applicazione web
Buon giorno a tutti,
ho bisogno di una spiegazione sul tema in topic. Non mi serve codice, e' proprio sulla teoria che sono poco ferrato. Il problema e' fare interagire due o piu' utenti connessi ad un sito che fa riferimento alla stessa applicazione web. Supponiamo per semplicita' che si tratti di una chat ma puo' essere qualsiasi interazione. Ora nella mia mente malata avviene questo: 0) tengo traccia delle sessioni aperte in una tabella del mio database 1) X utenti "entrano" nell'area comune cliccando sull'apposito bottone/link/quello che e' 2) Quando cliccano, un javascript (usando ajax?) in qualche modo comunica alla mia applicazione "ehy io utente xyz sto entrando nella stanza abc". 3) l'applicazione genera una tabella T relativa alla nuova "stanza" che si viene a creare in cui memorizza gli utenti connessi (tramite un id di sessione?) e il contenuto inviato dagli utenti 4) Ogni volta che l'utente invia dei dati (testo della chat o equivalente) c'e' un javascript (usando ajax?) che manda i dati alla mia applicazione. 5) l'applicazione memorizza i dati nella tabella e li rispedisce "broadcast" a tutti gli utenti 6) Il javascript che gira nel browser degli utenti intercetta i dati in arrivo (sempre con ajax?) e li stampa a video senza fare il refresh della pagina. Quando un utente abbandona la "stanza" il suo id di sessione viene tolto dalla tabella dei presenti o marcato come assente. Quando l'ultimo utente abbandona la "stanza" rimuovo la tabella dal database. Ora... questo meccanismo e' frutto della mia mente malata, quindi veniamo alle domande: 1) Funziona davvero cosi'? 2) Esiste un sistema piu' efficiente/veloce? (penso che con quello che ho scritto io il database e' abbastanza "stressato") 3) Esistono delle librerie gia' scritte per qualche linguaggio per fare questo? (lato server intendo) 4) Sapete indicarmi se ci sono libri o siti web o qualsiasi altra cosa su cui posso studiare come si risolvono questi problemi? Grazie ![]()
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli! ![]() |
![]() |
![]() |
![]() |
#2 | ||||||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Se stanze e utenti sono entità "stabili", cioè permanenti nel sistema / db, avranno quindi un loro ben preciso id associato, e quindi lasciamo perdere il concetto di sessione. La sessione serve a identifica e gestire un utente, i cui dati reali (incluso l'id) sono memorizzati nel db e non accessibili dall'esterno. Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
L'ideale, a mio avviso, è tenere un db tradizionale (SQL) per memorizzare le informazioni "stabili" (gli utenti, le stanze, e le loro informazioni, inclusi gli id), che rendono semplice la loro gestione. Mentre per quelle "aleatorie", come l'elenco dei (nuovi) messaggi, si memorizzano in una piattaforma NoSQL. Il server pescherà dall'una e/o dall'altra piattaforma a seconda di quello che gli server. Un po' di caching, poi, sarebbe ottimale, in modo da ridurre il carico sul db. Quote:
Personalmente ho smanettato con apache + mod_wsgi per implementare un server JSON-RPC. Ho realizzato anche un moduletto per gestire in maniera comoda il tutto, in modo da ridurre il codice delle API alla sola "business logic". Potresti fare qualcosa del genere anche tu. E' molto più semplice di quello che si possa pensare. Quote:
![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||||||||||
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Mar 2013
Messaggi: 11
|
Se il discorso è x una chat, di solito viene usato Java xkè puoi creare connessioni dirette tra utente e utente... senza quindi passare x il server, x il database o fare (come nel caso di "chat" in pagine web..) continue richieste adl db x sapere se ci sono nuovi messaggi...
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
Quote:
In realta' la curiosita' mi e' venuta pensando a un browser game e a come fosse possibile implementarlo. Non mi mettero' di certo a farlo pero' la curiosita' di capire era troppa. Certo che usare 2 db (uno SQL e uno NoSQL) e' un po' complesso(?)... o forse piu' costoso (noleggio di 2 db diversi) che complesso. Secondo te sarebbe possibile fare una cosa del genere su un servizio come webfaction? Intendo senza mettere in piedi il server io stesso. Oppure serve un VPS? Non credo lo mettero' mai on line ma mi sa che questo weekend lungo di pasqua provo a farlo sul mio pc ![]() Grazie delle info!
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli! ![]() |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
Quote:
In teoria puoi usare qualunque linguaggio per creare connessioni dirette tra utente e utente, ma onestamente e' una cosa che eviterei prima di tutto per motivi di sicurezza! Per creare connessioni dirette bisogna che i due utenti si scambino l'IP... Inoltre gli ip dei provider spesso e volentieri sono dinamici, quindi che succede se i due si scambiano un file e il provider cambia ti cambia l'IP? La connessione muore e va ripristinata, questa cosa va gestita... Inoltre non credo che abbia molto senso un'applicazione web che fa comunicare due utenti direttamente, a quel punto tanto vale fare un link diretto e bypassare il web evitando tutte le magagne dovute a HTTP e al suo essere stateless
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli! ![]() |
|
![]() |
![]() |
![]() |
#6 | ||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Quote:
Quote:
![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||||
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
Quote:
Te... guarda che bellezza... Ci carichi su quello che vuoi e costa una fesseria ![]() Buona pasqua!
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli! ![]() |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
In effetti per quello che offrono, è un prezzo stracciato.
Peccato che non ci sia già installato Firebird. La cosa che mi rompe le scatole è questa. Non sono un sistemista e non mi piace questo lavoro: vorrei avere già tutto pronto...
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#9 | |
Junior Member
Iscritto dal: Mar 2013
Messaggi: 11
|
Quote:
differente se devi inviare file o x un gioco online... ![]() |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
Sempre restando in tema, non riesco a capire un'altra cosa.
L'architettura di un "sito" io me la sono sempre immaginata così: C'è un computer su cui girano un programma server (tipo Apache) e un DBMS (tipo Postgres, MySQL, Oracle,...). Su questo computer io carico la mia applicazione e la faccio partire ma non gira per conto suo, gira all'interno di una specie di sandbox messa in piedi da Apache o da chi per lui. Quando Apache riceve le richieste HTTP dirette verso la mia applicazione glie le gira e poi rimanda indietro la risposta. Ora però mi rendo conto che questa cosa scricchiola perché ad esempio: Come funzionano sistemi come Tornado o Node.js? Sono sistemi indipendenti che non hanno bisogno di un web server o si limitano a gestire in maniera diversa le richieste che ricevono dal webserver? Perché, ad esempio, su Webfaction si possono caricare Node.js e anche Tornado e credo che si possano anche caricare applicazioni scritte in Go usando l'HTTP sever fornito dal linguaggio. Al momento l'unica spiegazione che so darmi è che il server è diviso in due fettine: una che spacchetta i pacchetti di rete (fino al livello trasporto di OSI per intenderci) mentre l'altra si limita ai livelli che stanno sopra (applicazione e presentazione) ed è quella che viene attivata quando carico Node.js su un hosting web preesistente. È corretto oppure ho fatto un gran fritto misto? ![]() Ritengo di avere poche idee molto ben confuse ![]()
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli! ![]() |
![]() |
![]() |
![]() |
#11 | |
Junior Member
Iscritto dal: Mar 2013
Messaggi: 11
|
Quote:
tutte le richieste arrivano al webserver... questo le smista... se sono pagine php vanno all'apaches, Pyton (quindi tornado) viene gestito in altro modo,... il webserver di fatto ritorna solamente le pagine statiche, quindi html puro... se trova degli script all'interno, li fa eseguire dall'ente preposto... ke può essere sullo stesso server, ma anke su server diversi (vedi iterazioni con il database..) una volta ke ki di dovere ha eseguito il codice, viene data la pagina risultante al webserver ke la spedisce al richiedente... molto probabilmente ho usato termini sbagliati, ma spero di aver chiarito un pò la cosa... ![]() Node.js nn ho capito bene cosa faccia... |
|
![]() |
![]() |
![]() |
#12 |
Member
Iscritto dal: Jul 2011
Messaggi: 246
|
Implementare una chat come ti è stato suggerito è semplice ma discretamente inefficiente. In particolare, continuare a interrogare il server ogni secondo (tramite AJAX per esempio) causa una mole molto grande di traffico inutile verso il server quindi non è una buona soluzione se si vuole scalare verso l'alto e gestire molti utenti.
Per risolvere questo problema ci sono varie tecniche: - fai long polling. In pratica funziona così: il client fa una get verso il server (AJAX va benissimo) ma questo non risponde fin quando non ha dei dati utili per il client. Nel frattempo lascia il socket aperto e ci scrive asincronamente quando il dato è pronto. Non appena il client riceve il dato, aggiorna la UI e fa immediatamente partire una nuova richiesta in un loop continuo (c'è una variante a questo tipo di implementazione, tuttavia il concetto è sempre lo stesso). Con questa soluzione, il server non viene inondato di richieste continue perchè il canale viene chiuso solo quando effettivamente ci sono dati. A grandissime linee, Facebook fa qualcosa di molto simile per implementare notifiche e altri aggiornamenti della parte client; - utilizzi i web socket che sono stati implementati in Tomcat da circa un anno a questa parte e ti offrono un canale di comunicazione bidirezionale su cui client e server possono scrivere asincronamente. Ottimo per situazioni tipo chat o webgame. Attenzione che vengono usate altre porte (se non ricordo male) quindi eventuali proxy e/o firewall potrebbero incazzarsi. Direi che la soluzione migliore è quella del long polling, molto facile da implementare se usi Java come linguaggio lato server e relative servlet.
__________________
Non c'è cosa peggiore nella vita di un programmatore di un errore che si presenta solo ogni tanto. CONCLUSO POSITIVAMENTE CON: oldfield |
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Apache, come pure Lighttpd, è un webserver che smista le richieste che gli arrivano al codice che si occuperà poi di processarle, il tutto offrendo un po' di funzionalità più avanzate. Ma il suo lavoro potrebbe benissimo farlo un server "monolitico", che fa tutto da solo. Ad esempio, prova a eseguire questo da command line: Codice:
python -m SimpleHTTPServer ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:29.