Ho due client browser: A e B . Comunicano attraverso un server di segnalazione Server .
A ha un heartbeat clientide che segnala il ClientState ad altri client. ClientState può essere uno dei seguenti:
-
StateFoo -
StateBar
A volte, B vuole cambiare lo stato di A . Mantiene una rappresentazione di A localmente. Quando viene visualizzato "Cambia% da% in A ", modifica StateBar (rappresentazione locale di uno stato del dispositivo remoto) prima localmente (a scopi UX), quindi segnala A.ClientState per modificare Server su ClientState : lo stato locale.
Questo di solito funziona, ma occasionalmente ci sono problemi di temporizzazione in cui l'heartbeat da A ripristinerà la modifica dello stato manuale che A ha avviato perché un heartbeat è stato inviato "a volte intorno" quando B ha inviato il segnale di cambiamento di stato.
Sto pensando a due approcci per risolvere questo problema:
- Timing: controlla se il server sta inviando qualcosa che è stato attivato dopo che ho modificato lo stato localmente. Questo tipo di funziona, ma se
Binvia un heartbeat subito dopo aver avviato una modifica dello stato daB, questo non funzionerà. - Prioritizzazione dei comandi: se l'ultima cosa che ha modificato lo stato era un comando, attendere n secondi prima di consentire un heartbeat (non un comando) per aggiornare nuovamente lo stato.
Non mi piace A perché riguarda un numero magico. I problemi di connettività di rete potrebbero spingere un ritardo oltre il 2 secondi.
Quali tipi di schemi sono disponibili per risolvere questo problema? La lingua non ha molta importanza; anche se sto usando C # / JS / SignalR nel caso abbia importanza.