Sono all'inizio della costruzione di un sistema di notifica in stile Facebook per la nostra pagina (tipo di social gaming) e ora sto cercando quale sarebbe il modo migliore per progettare tale sistema. Non sono interessato a come inviare notifiche all'utente o cose del genere (per ora anche). Sto cercando come costruire il sistema sul server (come archiviare le notifiche, dove memorizzarle, come recuperarle, ecc ...).
Quindi ... alcuni requisiti che abbiamo:
- nelle ore di punta abbiamo circa 1k utenti con accesso simultaneo (e molti più ospiti, ma non contano qui perché non avranno notifiche) che genereranno molti eventi
- ci saranno diversi tipi di notifiche (l'utente A ti ha aggiunto come amico, l'utente B ha commentato il tuo profilo, all'utente C è piaciuta la tua immagine, l'utente D ti ha battuto sul gioco X, ...)
- la maggior parte degli eventi genererà 1 notifica per 1 utente (all'utente X è piaciuta la tua immagine), ma ci saranno casi in cui un evento genererà molte notifiche (ad esempio il compleanno dell'utente Y)
- le notifiche dovrebbero essere raggruppate insieme; se ad esempio a quattro utenti diversi piace un'immagine, il proprietario di quell'immagine dovrebbe ricevere una notifica che indica che l'immagine è piaciuta a quattro utenti e non a quattro notifiche separate (proprio come FB)
OK, quindi quello che stavo pensando è che dovevo creare una sorta di coda in cui avrei memorizzato gli eventi quando si verificano. Quindi avrei un lavoro in background ( gearman ?) Che guarderebbe quella coda e genererebbe notifiche basate su quegli eventi. Questo lavoro memorizza quindi le notifiche nel database per ciascun utente (quindi se un evento interessa 10 utenti, ci sarebbero 10 notifiche separate). Quindi, quando l'utente apriva una pagina con l'elenco delle notifiche, leggevo tutte quelle notifiche per lui (pensiamo di limitare questa a 100 ultime notifiche) e le raggruppa e poi le mostra.
Le cose di cui mi preoccupo con questo approccio:
- complesso da morire :)
- il database è lo spazio di archiviazione migliore qui (stiamo usando MySQL) o dovrei usare qualcos'altro (anche redis sembra una buona scelta)
- cosa devo memorizzare come notifica? ID utente, ID utente che ha avviato l'evento, tipo di evento (in modo da poterli raggruppare e visualizzare il testo appropriato) ma poi non so come archiviare i dati effettivi della notifica (ad esempio URL e titolo dell'immagine che è piaciuto). Devo solo "infornare" tali informazioni quando generi la notifica, oppure devo memorizzare l'ID del record (immagine, profilo, ...) interessato ed estrarre le informazioni dal DB quando visualizzo la notifica.
- le prestazioni dovrebbero essere OK qui, anche se devo elaborare 100 notifiche al volo quando visualizzo la pagina delle notifiche
- possibile problema di prestazioni su ogni richiesta perché dovrei visualizzare il numero di notifiche non lette all'utente (che potrebbe essere un problema a sé stante poiché raggrupperei le notifiche). Ciò potrebbe essere evitato, tuttavia, se ho generato la vista delle notifiche (in cui sono raggruppate) in background e non al volo
Cosa ne pensi della mia soluzione proposta e delle mie preoccupazioni? Per favore, commenta se pensi che dovrei menzionare qualcos'altro che sarebbe rilevante qui.
Oh, stiamo usando PHP per la nostra pagina, ma questo non dovrebbe essere un grande fattore qui penso.