Quanta differenza nelle prestazioni delle applicazioni o nel sovraccarico del server sta avendo una chiamata di rete piuttosto che due per aggiornamento? Bene, dipende da quanti client simultanei ti aspetti e quanto spesso invieranno i sondaggi per gli aggiornamenti. Se hai un "piccolo numero di client" come 10 o 50 e richiedono aggiornamenti ogni N secondi (diciamo N tra 10 e 120), puoi fare i conti e scoprire che non si tratta di un carico di rete o di server sostanziale, quindi tu? Probabilmente stai sprecando il tuo tempo per ottimizzarlo.
D'altra parte, se avessi 100s, 1Ks o 1Ms di client simultanei e / o richiedano aggiornamenti ogni secondo o alcuni secondi, e / o non hai solo due tipi di oggetti da comunicare ma M & gt ; 2, con tutti i mezzi fare tutto il possibile per ottimizzare le interazioni.
Questo lascia ancora aperta una domanda chiave: l'aggiunta di un nuovo endpoint mega-REST ( /sync
) è davvero il modo migliore per farlo?
Forse no. Cormac Mulhall ha delineato alcuni aspetti negativi . Un problema più sottile è che la sincronizzazione è fondamentalmente difficile . Sembra non così difficile, ma molti negozi hanno ripetutamente rotto le loro scelte su di esso.
Perché la sincronizzazione è difficile? Bene, cerchiamo di graffiare quella superficie. Si menzionano gli URL che specificano ?since=<last-sync-timestamp>
. È il timestamp del server o del client? Saranno diversi . Il cronometraggio distribuito è di per sé difficile. Gli orologi variano. Puoi aiutarlo aggiungendo un'altra chiamata di riposo /time
che aiuta il cliente a stimare quanto il suo orologio è lontano dall'orologio del server. Ma ora hai la complessità della stima della deriva temporale, proprio come all'interno di Network Time Protocol . REST non è più così semplice. E che cosa significa un timestamp, comunque? ?since=1418070480
significa ...? È l'inizio di quel secondo, o la fine? Tieni presente che le CPU possono eseguire ~ 10 ** 11 istruzioni al secondo. I secondi sono una metrica grezza. Quindi tu dici: "Sai una cosa? Ci sarà un errore, quindi mi limiterò a mettere un margine di errore". Si coordinano gli orologi nel miglior modo possibile, quindi si aggiungono altri 20 o 30 o 60 secondi indietro, solo per catturare i ritardatari. Ora pensi di aver leccato il problema degli "aggiornamenti accidentalmente mancanti" - non lo hai davvero, in un sistema di qualsiasi complessità, ma facciamo solo finta. Ma hai creato un altro problema: la possibilità di duplicazione, perché stai chiedendo un altro N secondi di dati prima di dove pensi davvero di averne bisogno. Dovrai creare un codice lato client per assicurarti che gli oggetti non vengano pubblicati due volte. Il REST doveva essere semplice!
Anche con tutto questo, non hai affrontato l'elefante nella stanza: hai ancora un aggiornamento in stile sondaggio, in cui i clienti devono continuamente chiedere, chiedere e chiedere nuovamente: "Nulla di nuovo? No? Okay Che ne dici di adesso? No? Ok. E adesso? No? Okay ... "Il tuo server continua a essere colpito da richieste inutili. 90% del quale risponderà sempre "Niente di nuovo da segnalare."
La verità è che non hai ancora uno stile di comunicazione che sia anche a metà strada adatto ai requisiti di sincronizzazione. Il polling sarà sempre una chiacchierata, tecnica di caricamento del server. Quello di cui hai veramente bisogno non è AJAX o AJAJ aggiorna i sondaggi, ma al minimo Cometa (chiamate AJAX inverse a lungo polling) - o meglio ancora, un meccanismo di comunicazione avanti e indietro completo come WebSockets . Questi permettono al tuo codice lato server di stabilire tecniche push o interazioni push-pull che, pur non correggendo automagicamente tutte le semantiche difficoltà di sincronizzazione in un mondo distribuito, ridurre sostanzialmente la chiamata di rete, l'overhead del server e la complessità del codice necessaria per avere endpoint realmente sincronizzati.
In sintesi, un mega endpoint piuttosto che due singoli è un problema minore. Se vuoi una sincronizzazione temporale efficiente, il vero problema è che hai bisogno di un meccanismo di interazione migliore.