Qual è una buona pratica per inviare notifiche in un ritardo "quasi in tempo reale" in questo caso?

1

Voglio abilitare alcune notifiche in tempo reale sulle attività degli amici (social network).
Il contesto tecnico è: Webapp che chiama backend (API REST).

Lo scenario è:

Kevin segue Bob.
Quando Bob pubblica un nuovo commento, Kevin deve essere informato immediatamente (quasi in tempo reale).
Inoltre, quando Kevin accede, dovrebbe essere in grado di vedere alcune notifiche passate, simili a ciò che fa Facebook.
Significa che le notifiche dovrebbero essere memorizzate da qualche parte.

Ecco il flusso di lavoro tecnico:

  1. La pubblicazione di un nuovo commento da parte di Mario comporta un inserimento nel database di questo nuovo commento.
  2. Come seguendo Domain-Driven-Design, viene attivato l'evento CommentedItemEvent .
  3. Un lavoratore distinto nello stesso contesto limitato (processo di lunga durata, che esegue il polling del database ogni secondo) che ascolta questo evento lo cattura.

Alla fine del 3, vedo 2 possibilità:

  • Creazione della notifica corrispondente, memorizzandola nel database e POI inviandola a Redis Pub / sub. Questo alimenterebbe alcuni abbonati specifici che agiscono sulla connessione WebSocket per inviare la notifica al client di Kevin.
  • Creazione della notifica corrispondente, quindi invio a Redis THEN memorizzandoli nel database.

Per quanto riguarda la prima possibilità, il vantaggio sarebbe l'aspetto transazionale. In effetti, nessuna notifica potrebbe essere inviata se prima non fosse stata salvata. = > Integrità.
Tuttavia, lo svantaggio è che l'inserimento del database potrebbe rallentare il processo di "quasi in tempo reale di notifica".

Per quanto riguarda la seconda possibilità, le notifiche vengono inviate immediatamente, ma se si verifica qualche errore riguardante l'inserimento del database, Kevin potrebbe chiedersi:

"Humm ... ho ricevuto la notifica di Bob, sono sicuro di averlo visto, quindi perché un semplice aggiornamento della pagina non lo mostra più?" = > In effetti, non è stato mantenuto con successo, quindi non può interrogarlo.

Che cosa è una buona pratica in merito a questo caso d'uso?

Ovviamente, un modo più veloce sarebbe quello di non coinvolgere un listener di eventi per questo caso, ma violerebbe alcuni principi riguardanti il Domain-Driven Design. IMHO, database di polling listener nel suo contesto limitato è necessario. (evocato da Vaughn Vernon in questo libro IDDD - "Costruire un negozio di eventi")

    
posta Mik378 02.07.2014 - 16:49
fonte

1 risposta

1

La gestione degli eventi non è necessariamente qualcosa di interno solo all'istanza Dominio. A volte, un servizio esterno gestisce in modo più appropriato le esigenze di tali eventi rispetto a un'implementazione interna.

La messaggistica di testo, ad esempio, può essere gestita meglio da un servizio XMPP o IRC, che sono interfacciati come dipendenze nel dominio, attraverso un'interfaccia comune (ad esempio, notifica (messaggio) ha lo stesso aspetto del mittente all'interno del dominio).

Quindi potresti avere pochi domini: uno per la logica dei messaggi, un altro per la persistenza dei messaggi e un altro per la condivisione dei messaggi.

Un servizio esterno specializzato può accettare connessioni dalle istanze di Condivisione messaggi, che gestiscono casi ed eventi, inserendole tramite specifiche e regole di Logica dei messaggi.

La persistenza dei messaggi può connettersi allo stesso servizio, gestire semplicemente l'archiviazione dei messaggi in un database appropriato e persino aggiornare un motore di ricerca.

Tutti i domini correlati, ma non separati. Di sicuro, dovrai lavorare di più sulle garanzie di ciascun dominio (come il teorema CAP e la latenza).

    
risposta data 14.07.2014 - 16:25
fonte