2011-09-20 29 views
5

Non sto realmente parlando dell'applicazione di chat generale, ma piuttosto sull'implementazione della chatroom.Discussione: il modo migliore per implementare una chat room con node.js/socket.io?

Quindi, in node.js/socket.io, ho pensato a due approcci

  1. Creare una matrice per ogni chatroom, il messaggio trasmesso a tutti gli utenti in ordine di

  2. broadcast tutti i messaggi a tutti gli utenti, sui PC dei clienti, determinano se appartengono alla chat, in tal caso accettano il messaggio.

La debolezza in 1 è che alla fine, come si scala fino si inondare memoria del server con oggetti array, ed io con solo circa 80MB sul mio hosting.

La debolezza di 2 è che la trasmissione a tutti è costosa alla fine e inondare le macchine dei clienti non li renderà felici.

Sono sicuro che ci sono approcci migliori su come implementare la chat, quindi è per questo che ti sto chiedendo ragazzi per aiutarmi. Sto cercando le prestazioni sul lato server prima e poi sul lato client, e deve essere scalabile.

+0

Con 80 MB è possibile creare un sacco di chat. Gli array devono solo contenere gli ID dell'utente. Hai eseguito test di consumo di memoria? – user123444555621

+0

Abbiamo creato una [chat room multi-room] funzionante (https://github.com/Raynos/so642). È open source, sentiti libero di guardare. – Raynos

+0

@ pumbaa80 true, ma 80mb diventa come 20-30mb dopo aver eseguito molti altri processi o cron jobs di cui potrei aver bisogno, inoltre non credo ancora che sia un buon modo per scalare perché la memoria è costosa ... – Derek

risposta

1

ho fatto qualcosa di simile qui:

http://davidgranado.com/demos/chat_shuffle/

È possibile verificare il lavoro svolto mediante l'apertura di diverse finestre e chiacchierare con se stessi dal momento che ogni istanza è considerata una persona (è la mia prima app nodo).

Il modo in cui funziona è che ogni persona è associata a un'altra persona per una conversazione. In effetti, tutti sono in una stanza per due persone.

Per trasmettere i messaggi, registro gli utenti come associati l'uno con l'altro e li inviano solo al chat del partner. Questa idea può essere facilmente estesa a qualsiasi numero di persone per associare le chatter. In questo modo, non devi fare una trasmissione dispendiosa a tutti.

+1

quindi di avere persona1, persona2, persona3, come fa il server a inviare un messaggio/sapere che si trova in una chat senza dichiarare un array per raggrupparli in una chat come nel mio approccio 1? – Derek

+0

Penso che il mio cervello non sia così acuto in questo momento come pensavo. È fondamentalmente la stessa cosa. Al momento, non uso un array di per sé poiché sono solo due di essi. Ma per espandere l'idea, un array sarebbe perfetto per una chat room per sapere a chi trasmettere. –

5

Socket.IO 0.7+ ha introdotto un concetto di camere. Questa è probabilmente la cosa che stai cercando.

io.sockets.on('connection', function (socket) { 
    socket.join('room name'); 

    // broadcast the message to everybody in the room 
    socket.on('chat message', function (data) { 
    socket.broadcast.to('room name').emit('chat message', data); 
    }); 

    socket.on('leave room', function (room) { 
    socket.leave(room); 
    }); 
}); 

Quindi nessun bisogno di gestire il proprio array con gli utenti per camere specifiche, socket.io ha questa build in.

+0

non lo sapevo, cercherò in che modo implementano la funzione socket.join(). Ma prima, dove si trovano le documentazioni socket.io? – Derek

+0

del readme: https://github.com/learnboost/socket.io https://github.com/learnboost/socket.io-client Il sito http://socket.io/ E nella wiki https://github.com/learnboost/socket.io/wiki – 3rdEden

+0

Ho preparato una [semplice demo di una chat multiroom] (https://github.com/jgonera/socket.io-multichat) usando le stanze di Socket.IO. Viene fornito con un benchmark che ti permette di verificare quanto velocemente può essere. –