Direi che questa è più una questione economica. Tuttavia, questa è una chiamata di giudizio che gli ingegneri dovrebbero essere in grado di fare. Quindi, sto rispondendo.
Divido la mia risposta in quattro parti:
- Gestione del rischio
- strategie
- Costi
- Intuizione
Gestione del rischio
Pertanto, a volte il client non riesce a ottenere una risposta dal server. Presumo che ciò non sia dovuto a un errore programmatico (altrimenti la soluzione è risolverlo, quindi vai a farlo). Invece, deve essere a causa di una situazione fortuita al di fuori del tuo controllo ...
Ma non oltre la tua conoscenza. Devi sapere:
- Quanto spesso succede.
- Che impatto ha.
Ad esempio, se il fallimento e il tentativo si verificano solo circa il 2% delle volte, probabilmente non vale la pena affrontarlo. Se succede circa l'80% delle volte, beh ... dipende ...
Quanto tempo deve attendere il cliente? E come si traduce in costi ... vedi, hai un piccolo ritardo in un'applicazione normale, probabilmente non è un grosso problema. Se è significativo e hai un'applicazione in tempo reale o un videogioco online, questo allontanerà gli utenti e probabilmente stai meglio investendo in server più o migliori. Altrimenti, probabilmente puoi inserire un messaggio "caricamento" o "in attesa del server". A meno che, il ritardo sia davvero grande (nell'ordine delle decine di secondi), allora può essere troppo anche per l'applicazione normale.
strategie
Come ho detto sopra, ci sono più di un modo per affrontare questo problema. Presumo che tu abbia già l'attrezzo loop try-fail-retry. Quindi, vediamo ...
- Inserisci un messaggio di caricamento. È economico, aiuta la fidelizzazione dell'utente.
- Query in parallelo. Può essere più veloce, può ancora fallire. Richiederà un server ridondante (può essere costoso), perderà tempo e traffico di rete.
- Eseguire una query in parallelo per stabilizzare il server più veloce e utilizzarlo da lì in poi. Può essere più veloce, può ancora fallire. Richiederà server ridondanti (può essere costoso), non sprecherà tanto tempo server e traffico di rete.
Ora, noti che dico che questi possono ancora fallire. Se supponiamo che una query a un server abbia una probabilità dell'errore dell'80%, una query parallela a due server ha una probabilità dell'errore del 64%. Pertanto, potrebbe essere necessario riprovare.
Un vantaggio aggiuntivo di scegliere il server più veloce e continuare a usarlo è che anche il server più veloce ha meno probabilità di fallire a causa di problemi di rete.
Il che mi ricorda, se riesci a capire perché la richiesta non riesce, fallo. Può aiutarti a gestire meglio la situazione, anche se non riesci a prevenire gli errori. Ad esempio, hai bisogno di una maggiore velocità di trasferimento sul lato server?
Alcuni di più:
- Distribuire più server in tutto il mondo e selezionare il server in base alla geolocalizzazione.
- Effettua il bilanciamento del carico sul lato server (una macchina dedicata prenderà tutte le richieste e le invierà ai tuoi server, puoi avere il tuo parallelismo lì o una migliore strategia di bilanciamento).
E chi ha detto che devi fare solo uno di questi? Puoi inserire un messaggio di caricamento, interrogare più server che sono sparsi in tutto il wrold per scegliere il più veloce e usarlo solo da lì in poi, in caso di tentativi falliti su un ciclo e avere ognuno di quei server come un cluster di macchine con bilanciamento del carico . Perchè no? Bene, costa ...
Costi
Ci sono quattro costi:
- Il costo dello sviluppo (di solito molto economico)
- Il costo di implementazione (generalmente elevato)
- Durata dei costi (dipende dal tipo di applicazione e dal modello aziendale)
- Il costo del fallimento (probabilmente basso, ma non necessariamente)
Devi bilanciarli.
Ad esempio, supponiamo che tu guadagni circa un dollaro per utente soddisfatto. Che hai 3000 utenti al giorno. Che le richieste falliscono circa il 50% delle volte. E quel 2% degli utenti se ne va senza pagare quando la richiesta fallisce. Ciò significa che stai perdendo (3000 * 50% * 2%) 30 dollari al giorno. Ora, diciamo che lo sviluppo della nuova funzionalità ti costerà 100 dollari e la distribuzione dei server ti costerà 800 dollari - e ignorando i costi di runtime - questo significa che avresti un ritorno dell'investimento in ((100 + 800) / 30 ) 30 giorni. Ora puoi controllare il tuo budget e decidere.
Non considerare questi valori rappresentativi della realtà, li ho scelti per motivi di matematica.
addendum:
- Ricorda che sto anche ignorando i dettagli. Ad esempio, potresti avere pochi costi di implementazione ma pagare per il tempo della CPU e devi tenerlo presente.
- Alcuni clienti potrebbero apprezzare se non sprechi il loro pacchetto di dati in richieste ridondanti.
- Migliorare il tuo prodotto può aiutare a portare pubblicità naturale.
- Non dimenticare i costi delle opportunità. Dovresti sviluppare qualcos'altro?
Il fatto è che se si considera il problema in termini di costi di bilanciamento, è possibile effettuare una stima del costo per le strategie che si considerano e utilizzare questa analisi per decidere.
Intuizione
Intuizione se favorita dall'esperienza. Non sto suggerendo di fare questo tipo di analisi ogni volta. Alcune persone lo fanno e va bene. Ti sto suggerendo di comprenderlo e di sviluppare un'intuizione per questo.
Inoltre, in ingegneria, oltre alle conoscenze che otteniamo dalla scienza reale, impariamo anche nella pratica e compiliamo linee guida su ciò che funziona e cosa no. Pertanto, è spesso saggio vedere qual è lo stato dell'arte ... anche se a volte è necessario vedere al di fuori della propria area.
In questo caso, guarderei i videogiochi online. Hanno schermate di caricamento, hanno più server, sceglieranno un server in base alla latenza e potrebbero persino consentire all'utente di cambiare server. Sappiamo che funziona.
Vorrei suggerire di farlo invece di sprecare il traffico di rete e il tempo del server su ogni richiesta, anche essere consapevoli del fatto che anche con un server ridondante, può verificarsi un errore.