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 message
su unWebSocket
al server con un payload del messaggio - Il server riceve questo evento
new message
- Il server di fa un
async
chiama a unmongodb
server che salva il messaggio con il messaggio richiesto - Quando effettua la chiamata di
async
al 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
POST
al server - Il server riceve questa richiesta
POST
- Crea una chiamata
async
conawait
su 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!