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
B
invia 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.