Sono qui a un bivio e volevo chiedere l'opinione della comunità.
Sto creando un'applicazione di chat per la nostra azienda. Ora, come ogni applicazione di chat là fuori, i messaggi vengono salvati su un server che consente al client, in un secondo momento, di accedere ai vecchi messaggi.
Quello che mi manca è l'utilizzo di HTTP e WebSocket insieme in una situazione specifica. Li sto già usando, perfettamente bene e tutto funziona senza intoppi. La mia attuale scelta progettuale è questa:
- Il client invia un evento
new messagesu unWebSocketal server con un payload del messaggio - Il server riceve questo evento
new message - Il server di fa un
asyncchiama a unmongodbserver che salva il messaggio con il messaggio richiesto - Quando effettua la chiamata di
asyncal DB, invia anche un evento socket agli altri client con il messaggio fornito
Il problema che vedo è che cosa succede se la chiamata di async al DB fallisce e il DB non salva effettivamente il messaggio? Il client può ricevere il messaggio, ma quando si disconnettono e ricollegano, il messaggio cesserà di esistere nella conversazione perché non è mai stato salvato nel DB.
Fortunatamente, questo non è successo nei test, ma sappiamo tutti che possiamo fare tutti i test nel mondo, e in qualche modo qualcosa si romperà. Mentre pensavo a questo problema, ho trovato una nuova soluzione al problema:
- Il client crea un messaggio e invia una richiesta
POSTal server - Il server riceve questa richiesta
POST - Crea una chiamata
asyncconawaitsu di essa al DB - Usando le promesse, l'operazione ha esito positivo o non riesce
- Se riesce, viene inviato un evento socket agli altri client e il client che ha inviato il messaggio riceve una risposta dal server che ha avuto successo
- Se fallisce, il client viene avvisato e l'evento socket non viene inviato
So che mantenere una connessione persistente ha un sovraccarico minore quando i messaggi vengono inviati avanti e indietro rispetto a fare una chiamata HTTP su ogni messaggio, ma le chiamate HTTP permetteranno al client di assicurarsi che il messaggio sia effettivamente inviato e salvato.
Ora, la mia idea originale può essere trasformata nella mia nuova idea usando async/await con esso e se fallisce, quindi non inviare il messaggio. Posso creare un nuovo evento socket che emette come error e il client lo visualizza di conseguenza.
Non riesco a decidere quale sarebbe meglio, e volevo chiedere se uno di questi modi è migliore o se ci sono opzioni ancora migliori là fuori per questo particolare design di applicazione.
Grazie!