I task intensivi / dati intensivi della CPU appartengono al server

7

Sono nuovo nello sviluppo dei server, e sto cercando di capire dove la divisione delle responsabilità è per le attività ad alta intensità di dati, sto usando Node.js.

Ad esempio, dico che sto creando un'applicazione a singola pagina:

  • Il client esegue il rendering di una mappa con popolazione per area
  • Il server gestisce le richieste per i dati sulla popolazione

Tuttavia, supponiamo che anche io non sia il proprietario dei dati, ma che lo raccolgo da una terza parte tramite un'API. Questa API mi fornisce semplicemente un elenco di persone e la loro posizione. Dovrò sfogliare ogni persona, raggrupparli in base alla posizione, sommarli e quindi archiviarli in modo che possano essere accessibili ai fini dell'applicazione. Questo processo non ha bisogno di essere fatto tutto il tempo, dal momento che la popolazione non cambierà continuamente, ma diciamo che aggiorno questo set di dati una volta al giorno.

La mia domanda è mettere questo processo sul server sembra che sarebbe abbastanza intenso da rallentare le richieste. Vedo alcune opzioni, ma non sono sicuro quale sarà utilizzato in un ambiente di sviluppo professionale / essere più efficiente.

Potrei:

  • Invia al client i dati non elaborati e possono eseguire da soli l'analisi, ma l'esperienza dell'utente rallenta a tutti i livelli
  • Il server esegue l'elaborazione sullo stesso thread e una volta al giorno il server rallenta
  • Genera thread di lavoro sullo stesso server per gestirlo (scoraggiato?)
  • Avere un terzo server completamente separato, che il mio server principale ping una volta al giorno per elaborare i dati e restituirli.

C'è un altro modo per farlo, di cui non sono a conoscenza, oppure uno di questi metodi è una pratica migliore?

    
posta Kyle R 27.03.2018 - 19:35
fonte

2 risposte

2

La regola normale per il lavoro ad alta intensità di dati consiste nel posizionare l'elaborazione in modo che il "grande" blocco di dati non si muova molto. Questo perché i ritardi di rete sono spesso molto più grandi di qualsiasi altro ritardo di singola attività.

Da quanto hai descritto, la risposta potrebbe dipendere dalla dimensione totale della tabella di dati. Se la popolazione totale è di poche dozzine di e rimarrà piccola , il trasferimento di tutti i dati al client e l'elaborazione non comportano alcun ritardo significativo.

Tuttavia, sembra che il tuo problema potrebbe facilmente avere una popolazione di centinaia o migliaia. In tal caso, non si vuole assolutamente lanciare tutti i dati grezzi attraverso la rete in risposta a ogni query. Invece, vai con la tua scelta per generare un thread di lavoro sul server. Esistono diverse possibili strategie per distribuire il lavoro di aggregazione dei dati sulla popolazione in modo adeguato per mantenere le prestazioni del server a un livello accettabile.

    
risposta data 28.05.2018 - 07:11
fonte
1

sempre vuoi minimizzare la quantità di dati trasmessi tra server e client. Se facendo un po 'di lavoro extra il server può ridurre significativamente la quantità di dati da inviare, allora è molto probabile che sia una vittoria.

Altrimenti, hai la possibilità di ridurre la quantità totale di lavoro svolto o il costo totale per te. Se gestisci un server che serve 1000 utenti, che utilizzano tutti i moderni smartphone, la loro potenza di calcolo totale può essere dieci volte o cento volte superiore alla tua. C'è una buona probabilità che spostando il duro lavoro sui client, il tuo server possa consegnare i dati a tutti più velocemente, e nel complesso il tempo di attesa degli utenti è ridotto al minimo, più il tuo costo è ridotto al minimo.

Quale sarebbe più sforzo di programmazione sarebbe essere in grado di fare entrambi (calcola sul server o il client) e usarlo come bilanciamento del carico: se il tuo server riceve troppe richieste e inizia a cadere dietro, invia il lavoro ai clienti.

    
risposta data 28.05.2018 - 10:45
fonte

Leggi altre domande sui tag