Ho un sistema client-server che modella un processo aziendale interattivo con i seguenti quattro vincoli: -
-
Il client potrebbe avere dati obsoleti e / o il client potrebbe non essere affidabile. Tutti i comandi lato client devono essere convalidati sul server prima che i loro effetti diventino "verità" .
-
L'esperienza utente del client (anche se normalmente non è il processo stesso) è sensibile alla latenza, la connessione tra client e server non è affidabile e gli utenti devono essere in grado di continuare il proprio flusso di lavoro fuori dalla portata della rete. Il client deve (in una certa misura) essere in grado di aggiornare la propria vista dello stato senza effettuare un round trip sul server ad ogni comando - sebbene il server possa eventualmente rifiutare quei comandi una volta che la comunicazione è stata re -established.
-
L'hardware client e server non condivide una piattaforma. La mia capacità di condividere un'implementazione tra client e server è severamente limitata .
-
Il processo è complicato, multi-step e interattivo - lontano al di fuori del campo di applicazione ad es. framework di convalida basati su annotazioni .
La mia intenzione attuale è quella di costruire un sistema che assomigli alla previsione lato client utilizzata ad es. giochi per computer. Ciò richiede la creazione di una "copia" di una parte sufficientemente completa dello stato del sistema sul client, con il client che valuta i comandi contro questa copia cache dello stato e quindi sincronizza tali comandi con il server come e quando la connessione è disponibile .
Per raggiungere questo obiettivo, è necessario essenzialmente creare l'intero sistema: stato, comandi, regole ed eventi, due volte . Una volta sulla piattaforma del server e una volta sulla piattaforma client.
Mi sono imbattuto in requisiti simili in precedenza, ma mai con tutti e quattro questi vincoli. Sono sempre stato in grado di: a) accettare che il cliente potrebbe essere inaffidabile, b) accettare che il client debba effettuare il check-in con il server su ogni azione, c) utilizzare la stessa implementazione del processo sia sul client che sul server ( es. binari condivisi, o nodo), o d) costringere il modello in qualcosa di abbastanza semplice da usare un framework di convalida.
Sto studiando il transpiling, e anche in qualche modo invocando un ambiente di scripting compatibile dal server. Mentre quelle indagini sono in corso, le mie conclusioni iniziali sono che farlo sarà più più difficile che mantenere due "copie" del processo.
Prima di intraprendere questa follia: ci sono delle altre strategie per i processi interattivi client-server che minimizzano il requisito per l'implementazione duplicata?