Progettazione di un sistema di feed e notifiche in MongoDB

3

Sto sviluppando un'API NodeJS che verrà utilizzata, per ora, da un'app Android.

Ho bisogno di 2 cose importanti qui: un feed di notizie e un sistema di notifica. E ho bisogno che sia scalabile.

Sto usando MongoDB con Express per questo progetto.

Sistema di notifica

Informazioni sul sistema di notifica Sto pensando a un documento che dovrebbe contenere:

  • attore : id che fa riferimento a un oggetto Utente
  • verbo : una stringa che definisce il tipo di azione: aggiungi amico, commento, ecc.
  • oggetto : un ID che si riferisce a: Utente, Attività, qualunque sia, a seconda del tipo di verbo. Otterrei l'oggetto corretto in base al valore del verbo.

Il mio più grande dubbio su questa struttura è: come posso restituire tutti questi dati alla mia app per Android. È corretto restituire un JSON con la notifica non popolata (solo ID) e l'app Android utilizza gli ID e richiede l'API per creare la notifica. Voglio dire, il client farebbe una chiamata a: / getUser /: id per ottenere il nome utente, quindi / getActivity /: id per ottenere i dettagli dell'attività, si ottiene il punto ... Non sarebbe che molte chiamate solo per una notifica?

Perché, immagina un utente che riceve 50 notifiche, sarebbero solo circa 100 richieste per ottenere i dettagli della notifica. Se ciò accade agli utenti 1K, sarebbero richieste 10K per ottenere i dettagli della notifica.

News Feed

Qual è il modo migliore con il mio cliente per ottenere l'ultima attività? Basta interrogare il database per gli ultimi dati inseriti che corrispondono ai criteri?

Non dovrei soffermarmi troppo su questo perché l'applicazione partirà in piccolo, ma mi piacerebbe iniziare con un design non così cattivo. Questa è la mia prima applicazione di questo tipo, quindi non so cosa aspettarmi.

Grazie!

    
posta Kevin Amorim 02.12.2016 - 21:59
fonte

3 risposte

0

Sistemi di notifica

In genere, i sistemi di notifica utilizzano una coda dei messaggi piuttosto che i join tra le proprietà modellate.

In questo modello:

  • Una coda messaggi è solo una lista a cui accetti di aggiungere.

  • Ogni utente ha una coda di messaggi univoca.

  • I messaggi per quell'utente vengono aggiunti alla fine della coda.

  • Le richieste di nuove notifiche prelevano tutti gli elementi in una coda dopo un indice specifico, in genere in gruppi di N .

  • Le chiamate per le notifiche possono anche includere richieste tra due qualsiasi indici. Ciò ti consente di recuperare le notifiche meno recenti.

  • I sistemi di notifica in genere richiedono la persistenza. non vuoi che i vecchi messaggi non siano recuperabili. Quindi gli eventi non vengono mai rimossi dalla coda.

Non hai torto a modellare gli utenti del tuo sistema con ID o il tipo di interazioni che possono avere come stringhe in MongDB.

L'unico problema è che stai tentando di eseguire un massiccio join esterno per recuperare ogni nuovo evento. Questo, come hai correttamente previsto, porta a un numero elevato di richieste.

Non c'è nulla che impedisca al tuo back-end di creare nuovi oggetti Event da utenti e tipi di interazione, archiviandoli in un elenco che è abbinato in modo univoco a un utente e consumandoli dalla coda. Questo riduce il numero di chiamate che devi effettuare per recuperare in modo significativo le nuove notifiche.

Potresti dare un'occhiata ad Apache Kafka, che è un sistema di log immutabile con garanzie di persistenza incorporate, piuttosto che un database orientato ai documenti come MongoDB per gestire le code dei messaggi.

News feed

Un feed di notizie è solo una coda che contiene un tipo di evento diverso.

Puoi riutilizzare le code dei messaggi qui.

    
risposta data 06.10.2018 - 05:01
fonte
0

Stai facendo le domande giuste e hai una buona struttura di partenza. Dai un'occhiata a W3C Activity Streams 2.0 [1], in pratica dice la stessa cosa: actor, type = verb, object, target (oggetto secondario) e può avere altri elementi di dati opzionali. Ho spesso usato un oggetto "contesto" con una mappa di proprietà pertinenti.

Come per il recupero delle notifiche, materializzarle in tabelle o datastore separati. Ho lavorato su tutte le scale di sistemi e questo diventa un problema con solo centinaia di utenti. Quando un utente fa qualcosa, la quantità di lavoro per scrivere la notifica è finita. Se si inviano costantemente notifiche di polling per molti utenti, il carico aumenta con il numero di utenti attivi indipendentemente dalla presenza di nuove notifiche. Significa anche che hai un codice personalizzato per sintetizzare le notifiche da ciascun tipo di sorgente.

Ora, pur sapendo tutto questo, se hai solo pochi tipi di notifica limitati e non molti utenti attivi, basta andare avanti e interrogarli se riesci a svilupparli più velocemente. Ottieni le funzionalità nelle mani degli utenti. I problemi di rendimento sono ciò che ci piace pensare, ma finché non si presenta un problema, vengono prima le funzionalità di creazione e la base di utenti.

[1] link

    
risposta data 08.10.2018 - 00:40
fonte
-1

Bene, in quel caso :) Dai un'occhiata a questo repo: link Fa esattamente quello che vuoi e anche implementa l'aggregazione.

    
risposta data 06.09.2018 - 00:42
fonte

Leggi altre domande sui tag