Sto implementando un meccanismo per informare un gruppo di utenti sui commenti del blog appena inseriti. L'architettura utilizza il meccanismo Redis Pub / Sub.
Per definizione, il meccanismo pub / sub ha lo scopo di propagare il messaggio agli abbonati giusti, senza memorizzare / persistere nulla.
Sebbene i commenti sui blog siano ovviamente persistenti nel DB, mi aspetto anche che tutte le notifiche vengano inviate per essere mantenute per poter essere recuperate in qualsiasi momento da un utente non in linea che viene nuovamente registrato. Ovviamente, Redis potrebbe avere messaggi persistenti, ma il costo è piuttosto alto.
Uso un database principale distinto, prendiamo per l'esempio MySql. Attualmente, il flusso di lavoro è:
- Un commento sul blog pubblicato da un utente viene gestito dal mio back-end e archiviato per la prima volta nel DB.
- Viene generato un evento, chiamiamolo "CommentedBlogEvent", che attiva un worker che mira a rilevare tutti gli utenti target del commento.
- Supponendo che 10 utenti siano target del commento, inserisco 10 "righe di notifica" nel mio database associando il commentId e il userId targetizzato, ciascuno specifico per un utente poiché avrebbe un flag letto / non letto.
- Quindi, una volta che tutte le notifiche sono state mantenute, utilizzo Redis Pub / Sub per attivare gli iscritti che mirano a inviare risultati ai client online interessati (tramite WebSockets, ad esempio).
Il "problema" è che il processo potrebbe essere lento a causa del passaggio 3.
Sarebbe tollerato effettuare il passaggio 4 prima del passaggio 3, ovvero prima di persisterlo in DB, dal momento che una potenziale perdita di dati non è drammatica nel mio caso (dati non finanziari, ecc.)?
Vantaggio: il cliente ottiene risultati più rapidamente.
Svantaggio: l'utente può ricevere una notifica che non è stata salvata in background, portando a una notifica mancante quando l'utente aggiorna la pagina.
Qual è il modo migliore per gestire questo caso, mantenendo il mio database principale come archivio delle notifiche?