Utilizzo corretto di stanze / spazi dei nomi durante la creazione di un feed di notizie con socket.io

2

Sto lavorando alla creazione di un feed di notizie per un software che avrà dati inviati a diversi livelli gerarchici all'interno del software. Ad esempio, il software supporterà più organizzazioni, ognuna delle quali può avere più squadre, con più squadre sotto ciascuna di quelle.

Gli utenti di livello superiore nell'organizzazione possono vedere i contenuti di tutti i contenuti pubblicati in qualsiasi punto dell'organizzazione (o in qualsiasi dei suoi team o squadre). Gli utenti di livello medio dovrebbero essere in grado di vedere i contenuti pubblicati sull'intera organizzazione o contenuti solo all'interno della propria squadra (e delle sue squadre). Gli utenti di livello più basso dovrebbero vedere i contenuti pubblicati solo sull'intera organizzazione, o sul loro team o sulla loro squadra specifica.

Il database differirà anche tra i "post", che possono apparire su un certo numero di feed di persone e essere commentati, e le "notifiche" che sono indicatori per singoli utenti che accadono particolari eventi e che devono essere ignorati dall'utente.

Devo anche notare che al momento, sono non interessato ad assegnare pesi diversi ai post e solo facendo apparire determinati post. Io sto bene quando tutti vedono ogni post relativo a loro in ordine cronologico inverso.

Ora, sto pensando di utilizzare socket.io per rendere questo feed feed aggiornato. Dalla mia comprensione, socket.io conta su spazi dei nomi e stanze da determinare. La mia domanda riguarda come sfruttare queste funzionalità per rendere questa funzione di feed.

Da un primo sguardo, posso vedere uno dei due modi per affrontare il problema:

Opzione 1: Crea spazi dei nomi socket.io (o forse stanze) per ogni nodo nella gerarchia dell'organizzazione (l'organizzazione stessa, ogni squadra, ogni squadra) e fai in modo che ogni cliente si unisca a ciascuno di i relativi spazi dei nomi (gli utenti di livello superiore si unirebbero a tutti gli spazi dei nomi nell'intera organizzazione, gli utenti di livello inferiore si unirebbero solo allo spazio dei nomi dell'organizzazione globale, al loro spazio dei nomi della squadra e al loro spazio dei nomi della squadra). Il feed rivolto all'utente sarà un aggregato di tutti gli spazi dei nomi in cui si trovano.

L'aspetto positivo di questo design è dato dal fatto che ci sono più utenti per spazio dei nomi, anche se sto scrivendo nuovi post nel database, posso inviare messaggi direttamente da un client agli altri in quello spazio dei nomi. Ciò evita di dover effettuare ricerche nel database per distribuire i post agli altri utenti già presenti nell'applicazione.

Opzione 2 : crea uno spazio dei nomi socket.io (o ancora, forse una stanza) per ogni utente. Quindi, fai in modo che ogni client esegua periodicamente il polling del server per i nuovi post rilevanti per loro e che venga visualizzato nel loro feed di notizie. Questa opzione sarebbe effettivamente una soluzione di stile AJAX senza il sovraccarico delle chiamate AJAX effettive al backend PHP su cui questa applicazione è scritta.

Una sorta di variazione di questa seconda opzione potrebbe essere quella di creare ancora uno spazio dei nomi per ogni utente, ma poi quando vengono pubblicati nuovi contenuti, i messaggi devono essere inviati direttamente ad altri spazi dei nomi utente. Non sono sicuro se / come sarebbe possibile.

Sarei grato se qualcuno potesse dare qualche consiglio su come procedere.

    
posta Christian 19.05.2015 - 22:25
fonte

1 risposta

2

Ora che sono passati quasi 3 anni e il software in questione è stato in produzione con centinaia di migliaia di utenti per tutto il tempo, ho intenzione di rispondere alla mia stessa domanda.

Sono andato con l'opzione 2, in cui ogni utente si unisce a una singola stanza unica. Il server esegue il lavoro di iterazione attraverso gli utenti connessi e invia i dati appropriati a ciascun utente (utilizzando Redis PUB / SUB per gestire la trasmissione di nuovi eventi). Con il senno di poi, questo è stato sicuramente l'approccio giusto, in quanto consente il siloing dei dati di ciascun utente. Questo è sia concettualmente più semplice da pensare e più facile da scrivere codice, in particolare quando si torna al progetto per aggiungere funzionalità o apportare altri aggiustamenti alla propria logica di business.

    
risposta data 07.04.2018 - 10:04
fonte

Leggi altre domande sui tag