Sfondo
Sto lavorando su un'app per un client che include alcune funzionalità di social networking. Inizialmente stavo sviluppando il front-end mobile, ma le circostanze mi hanno lasciato in carico nello sviluppo del back-end.
Come sfondo generale, il nostro sistema consente agli utenti di seguire altri utenti e ricevere notifiche su quelli che stanno seguendo, come ci si aspetterebbe da un social network. Un avvertimento è che solo un piccolo sottoinsieme (al massimo poche centinaia) di utenti sarà seguito, con l'aspettativa che la maggior parte della base di utenti seguirà almeno uno di questi individui.
Sul lato dell'interfaccia utente, avremo un pulsante di notifica con un numero su di esso e facendo clic sul pulsante ti verrà visualizzata la schermata di notifica.
Il problema
Ho svolto ricerche sulle strategie per l'implementazione delle notifiche e sulla maggior parte delle risorse che ho trovato utile per creare una o più tabelle di notifica nel database. (Un esempio che mi piace è la risposta accettata qui: link ).
La cosa che mi sta scoraggiando è che la maggior parte delle strategie basate su database per le notifiche richiedono l'inserimento di una riga per ogni notifica per ciascun follower. Quindi se migliaia di persone stanno seguendo Sally, inseriamo un migliaio di righe nella tabella corrispondente. È scalabile? Cosa succede se arriviamo al punto in cui decine o centinaia di migliaia di utenti stanno seguendo Sally e sta facendo qualche dozzina di post al giorno?
La mia idea originale era stata di gestire tutto con le query: il numero sul pulsante di notifica sarebbe stato ottenuto richiedendo il conteggio delle righe sul contenuto pubblicato più recentemente rispetto all'ultima volta che hai visitato la schermata di notifica, mentre le singole notifiche sarebbero state generate da query più dettagliate quando hai visitato la schermata di notifica. Questo approccio non richiederebbe scritture o storage extra, ma è inflessibile e probabilmente bloccherà il server abbastanza duramente.
SETUP
Il back-end (come stabilito dallo sviluppatore precedente) utilizza CodeIgniter e un MySQL database. Attualmente è in esecuzione su un account di hosting condiviso GoDaddy scadente, ma presumo (spero?) Che questo verrà aggiornato prima di entrare in produzione e il pacchetto di hosting verrà ridimensionato con la crescita degli utenti.
Attualmente il nostro unico front-end è un'app mobile, ma abbiamo in programma di creare in seguito un sito web. Al momento non sono interessato ad ottenere aggiornamenti push in tempo reale dal server riguardo alle notifiche.
APPENDICE
Non sono specializzato in backend e sono sopra la mia testa in quel dipartimento. Il cliente lo sa, e ho fatto del mio meglio per cercare di spiegare lo scopo di un progetto di questo tipo, ma hanno chiarito che a questo punto non si fideranno di nessun altro per lavorare sul progetto. Probabilmente avremo un altro mese di lavoro da fare prima di poter aggiungere nuovi tester e ottenere qualsiasi tipo di metrica sul rendimento. Non riesco davvero a stimare quanti utenti potremmo avere o quale hardware potremmo avere nei prossimi 5 anni, ma penso che il cliente speri per centinaia di migliaia di utenti o più.
Spero che questo sia un problema specifico da pubblicare qui; Posso perfezionarlo se necessario. Si prega di chiedere se avete domande o ho omesso dettagli importanti.
tl; dr
- Un sistema di notifica basato su database ha implicazioni negative per la scalabilità a lungo termine quando tutti gli utenti seguono solo alcune delle poche centinaia di persone?
- C'è un modo per rendere le notifiche guidate da database senza bisogno di una riga di notifica separata per ogni notifica per ogni follower?
- Un sistema di notifica interamente basato su query potrebbe essere scalabile o avere vantaggi oltre a non scrivere dati nel DB?
- Sto pensando troppo a questo troppo presto? Dovrei semplicemente creare qualcosa che funzioni per ora e possiamo preoccuparci di ottimizzarlo se diventa un problema, dato che il cliente ha un budget limitato e non sappiamo ancora se il prodotto finale sarà popolare?