Invia lavori pesanti di calcolo dal server web a un altro processo e attendi la risposta

0

So che è prassi comune inviare task pesanti con controllo della cpu ai processi in background, al fine di liberare un server web per servire altre richieste.

Ma - cosa succede se la richiesta deve conoscere il risultato di tale calcolo? Esiste uno schema noto, in cui il server Web attende che un processo in background finisca il suo lavoro, prima che risponda? Non sono riuscito a trovare alcun esempio di questo caso d'uso.

Nel mio caso, ad esempio, voglio inviare il corpo di una richiesta HTTP post al processo Spark Streaming che viene eseguito separatamente dal server, attendere il risultato e rispondere alla richiesta. (Server e Spark Streaming comunicano tramite Kafka)

Grazie mille

    
posta AlonL 04.02.2015 - 23:34
fonte

2 risposte

1

Il server Web dovrebbe fornire risposte HTTP (ai client Web, ovvero il browser) abbastanza rapidamente. Un utente sarebbe scontento se una pagina web viene caricata in più di un secondo o due.

Tuttavia, puoi utilizzare AJAX e websocket tecnologie (con HTML5 e Javascript) nella tua pagina web. Quindi la tua pagina web potrebbe interrogare in modo asincrono o periodico il server web (che interrogherebbe l'altro processo)

    
risposta data 05.02.2015 - 06:29
fonte
1

Quello che stai descrivendo è la programmazione asincrona, e in particolare il modello IO non bloccante. Ha implementazioni concrete in molte lingue, tra cui Go, JavaScript (NodeJS), Clojure, Erlang, C #, P, F #, Python, Perl, Ruby, C, ecc.

La lingua Go, ad esempio, è stata progettata pensando proprio a questo tipo di problema. Usa le goroutine per passare l'esecuzione a un processo non bloccante. C'è un'app di esempio che gira intorno a qualche parte che è un'app di accorciamento dell'URL che fronteggia le richieste con una semplice routine e passa il calcolo dell'abbonamento a una goroutine che può quindi essere passata ad altri nodi logici o fisici, consentendo al programma di ridimensionare tanto come necessario.

Se conosci JavaScript, considera la possibilità di esaminare gli esempi NodeJS utilizzando async e Promises.

La tua implementazione specifica dipenderà dal tuo stack tecnologico. Non conosco i dettagli dell'implementazione di Spark Streaming e Kafka, ma l'idea di base è che il tuo programma crei una richiesta asincrona a Spark Streaming, che tiene traccia usando una Promessa o un equivalente. Continua a elaborare nuove richieste in attesa che venga restituito il risultato della richiesta esistente. Una volta restituito il risultato, invia la sua risposta.

    
risposta data 06.04.2015 - 12:15
fonte

Leggi altre domande sui tag