La cattiva idea di una chat room basata sul database?

3

La maggior parte dei semplici sistemi di "chat di gruppo" si basano su log di archiviazione di file locali (ad esempio log.txt ).

Sto sviluppando una semplice chat di gruppo (con meno di 20 utenti simultaneity) con jQuery / AJAX.

In pratica, il codice lato client carica il log dal server ogni secondo . Deve essere veloce.

Nel sistema di database (PHP / MySQL) che significherebbe query MySQL ogni secondo. Quel sovraccarico per il server (hosting condiviso)?

    
posta mr null 08.04.2012 - 08:45
fonte

5 risposte

8

L'ho già fatto prima, nei giorni precedenti l'utilizzo dei framework AJAX. L'utilizzo di un database andava bene. Il trucco è assicurarsi che ogni client conosca l'ID del messaggio più recente che è stato visto. Ogni volta che il client richiede nuovi messaggi, deve inviare questo ID. Quindi quando si esegue una query sul database, recuperare solo quei messaggi il cui ID supera quello fornito dal client. Questa sarà una query molto veloce, che dovrebbe restituire al massimo una manciata di righe.

    
risposta data 08.04.2012 - 11:00
fonte
6

La cache è la tua risposta.

Se il tuo hosting condiviso ha abbastanza risorse (la tua applicazione non dovrebbe richiedere molto) e ha un qualche tipo di sistema di cache installato, dovrebbe essere un gioco da ragazzi con il caching.

Alcuni modi per farlo:

  • memorizza i messaggi direttamente nella memoria e recupera da lì,
  • memorizza i messaggi nella memoria e usa insert delayed per memorizzarli nel database.
  • memorizza i messaggi nel database e interroga il database a intervalli e li memorizza nella memoria.

Apc e memcache sono alcune delle soluzioni di caching disponibili. Oppure puoi anche usare la cache mysql.

    
risposta data 08.04.2012 - 11:15
fonte
1

Come per qualsiasi cosa su hosting condiviso, dipende un po 'da quello che altro è in esecuzione sullo stesso server, cercando di utilizzare le stesse risorse. A condizione che il tuo host abbia una politica di fair use sufficiente, penso che una query del database ogni secondo per 20 persone (il massimo che hai dichiarato) andrebbe bene.

Se hai davvero bisogno di questo per essere veloce, dovresti davvero investire in qualche hosting migliore - al giorno d'oggi è sporco a poco prezzo.

    
risposta data 08.04.2012 - 08:53
fonte
0

IMO un modo migliore sarebbe che il client richiedesse aggiornamenti e inviasse le nuove linee

puoi farlo mantenendo le ultime 50 righe in una coda (ogni timestamp)

  • quando un client si unisce puoi inviarlo per intero alla coda

  • quando il client richiede un aggiornamento trova la sezione che è stata aggiunta dall'ultima riga richiesta dal client (il timestamp del client fornito nella richiesta) e invia quelli

  • quando il client registra una riga lo hai aggiunto alla coda ed elimina la riga più vecchia

nessuna chiamata al DB e nessun accesso al disco = > veloce

se hai bisogno di registri quando viene aggiunta una riga, aggiungila a un buffer che scarichi periodicamente su qualsiasi sistema di archiviazione che vuoi utilizzare

    
risposta data 08.04.2012 - 13:50
fonte
0

I database relazionali dovrebbero fare esattamente quel tipo di lavoro, i file di log non lo sono. Ovviamente possiamo sostenere che ci sono soluzioni migliori / più veloci, ma questa non era una domanda a portata di mano, quindi salterò questa cosa.

Se sai come normalizzare i dati e amp; utilizzare gli indici non dovrebbe esserci alcun problema ma suggerirei di archiviare le chat più vecchie in un insieme separato di tabelle (ad esempio ogni notte sposta tutte le chat più vecchie di 2 giorni) in modo che gli indici e il set di dati live siano il più piccoli possibile e anche il set di dati eventualmente potrebbe essere tenuto in memoria (MySQL funziona alla grande quando può conservare tutti i dati necessari in memoria).

D'altra parte avere 20 richieste al secondo potrebbe essere un problema sul tuo hosting condiviso dal momento che questi tipi di hosting non sono pensati per quel traffico (solo i dati di polling per 1 chatroom con 20 utenti genererebbero 1,7 milioni di richieste al giorno) . Quel numero di richieste può creare problemi indipendentemente dall'origine dati (mysql, file di registro, memcached, mongo).

    
risposta data 08.04.2012 - 22:18
fonte

Leggi altre domande sui tag