Il modo migliore per notificare al client in tempo reale che il loro lavoro di coda (ad esempio SQS) è terminato?

7

Scenario corrente

La nostra applicazione consente agli utenti di caricare (Amazon S3) e gestire i loro file attraverso la nostra interfaccia. Attualmente questi utenti possono scaricare i file direttamente da S3 / Cloudfront attraverso la nostra applicazione.

Aggiunta di una funzionalità Zip

Vogliamo aggiungere una funzionalità al sistema che consente agli utenti di selezionare più file contemporaneamente e di scaricarli come file zip.

Vorremmo che il processo funzionasse in tempo reale, in modo tale che quando l'utente fa clic sul pulsante per scaricare un file zip, il sistema elabora la richiesta, compila lo zip e restituisce lo zip all'utente finale. Mentre il processo è in esecuzione, il front-end comunicherà all'utente che la richiesta è in fase di elaborazione e, una volta completata, chiederà loro di scaricare il file.

Strategia proposta

La nostra applicazione è basata su cloud AWS, quindi il mio primo istinto è utilizzare Amazon SQS (ma sono aperto ad altri suggerimenti) per costruire un sistema di coda per gestire queste richieste. Il flusso funzionerebbe in questo modo:

  1. L'utente seleziona i file e richiede la creazione di un file zip.
  2. Il front-end invia una richiesta a SQS con i file da zippare e la destinazione (su S3) in cui verrà archiviato il file zip finale.
  3. L'addetto alla coda utilizza sondaggio lungo per verificare la presenza di nuovi SQS lavori. Quando viene trovato un lavoro, l'operatore scarica i file da S3, li fa zip e restituisce il file zip finito nella posizione specificata su S3.
  4. Ora che la coda ha terminato l'elaborazione, avvisa il cliente che il suo lavoro è terminato e il loro file è pronto per il download.

Il modo migliore per gestire il passaggio 4?

Questo processo sembra essere un approccio solido, e tutto ha senso fino al passaggio 4. Stiamo lottando con il modo migliore per informare l'utente finale in tempo reale che il loro lavoro è finito e il loro file è pronto per il download.

Dalla mia ricerca ho visto tre modi che la gente suggerisce:

  1. Utilizza pub / sub per creare un socket per il lavoro e restituire la risposta al termine.

    • Da tutto ciò che ho letto, non è consigliabile (e talvolta non è possibile) creare un gran numero di socket / sub / canali open pub. Inoltre, in che modo SQS notifica al socket aperto che il lavoro è stato completato? Questo articolo riguardante Amazon SNS all'inizio sembrava promettente, ma sembra dedurre che sia si consiglia di utilizzare un singolo argomento SNS per l'intera coda, non un argomento SNS per processo. Questo sembra un ottimo approccio se volessimo semplicemente inviare una e-mail all'utente, facendogli sapere che il loro lavoro è finito. Tuttavia, voglio essere in grado di aggiornare l'interfaccia utente all'interno del browser web.
  2. Polling continuo dal server front-end per il file zip finito su S3.

    • Se ci sono migliaia di lavori simultanei, ciò creerebbe migliaia di richieste. Questo approccio non sembra molto scalabile e potrebbe potenzialmente costare denaro con chiamate S3 api extra.
  3. Lascia una richiesta di lunga durata aperta

    • A causa del fatto che se ci sono molti lavori in coda, il tempo necessario per consegnare la risposta potrebbe causare il timeout della richiesta. Inoltre, questo crea un sacco di risorse strappo / sprecate sul server Web front-end. Di nuovo, non molto scalabile.

La mia domanda

Tenendo conto dei punti che ho menzionato sopra, qual è il modo migliore per notificare al client front-end che la loro coda di lavoro è terminata e il loro file è pronto per il download?

Un ottimo esempio di ciò che sto cercando di fare è YouTube. Quando carichi un video su YouTube, la loro coda elabora il tuo video e, una volta completato, ti informa che l'elaborazione del video è terminata. Sto cercando di replicare lo stesso concetto, tranne che nel mio scenario, voglio solo che il client sappia quando il file zip è stato preparato e caricato su S3.

Sono a conoscenza di soluzioni teoriche, quindi per favore sii specifico. Sono aperto a qualsiasi suggerimento, indipendentemente dal fatto che utilizzino SQS o una qualsiasi delle tecnologie / metodologie che ho elencato. Indicare qualsiasi esempio di codice reale di questo genere di cose sarebbe un grande vantaggio.

Grazie in anticipo per il tuo grande aiuto!

    
posta Slickrick12 03.01.2014 - 17:52
fonte

1 risposta

0

Il mio pensiero è che il tuo front-end stabilisce un evento inviato dal server ( link ) con un server web che invia al lavoratore il messaggio di lavoro do tramite SQS. Una volta completato, il lavoratore aggiunge un messaggio al server Web su una coda separata che viene interrogata per batch di messaggi alla volta, per ognuno che restituisce l'evento al client.

Non è necessario utilizzare socket Web poiché il client e il server non converseranno avanti e indietro.

    
risposta data 03.01.2014 - 22:15
fonte

Leggi altre domande sui tag