2012-10-09 10 views
6

Ho un controller Rails su Heroku dove invio email in un ciclo e rispondo all'utente con alcune informazioni su quale indirizzo email sono state inviate le email.Prevenire il timeout della richiesta con richieste lunghe

Mentre funziona quando vengono inviate solo poche (~ 40) e-mail, la richiesta scade quando non ci sono più di poche e-mail da inviare (ad es.> 40).

Heroku stati nelle loro guide che le richieste devono rispondere con almeno un byte entro 30 secondi: https://devcenter.heroku.com/articles/request-timeout

Anche se so che questo non è il modo migliore per raggiungere questo obiettivo, attualmente sto cercando di capire come fallo in Ruby.

Se si trattasse di un'app PHP, potrei fare un echo prima di entrare nel ciclo, e quindi mantenere echo qualcosa in ogni iterazione. Come posso ottenere qualcosa di simile nei binari?

risposta

4

La soluzione migliore è quella di non effettuare la spedizione prima di inviare la risposta. Avrai maggiore fortuna prima di aggiungere il lavoro a una delle numerose code di lavoro disponibili di Heroku, quindi dare il via a una pagina di monitoraggio che mostra l'avanzamento del lavoro e si aggiorna periodicamente. Se si sta tentando di evitare l'uso di uno di questi servizi di coda, per ragioni di budget, è possibile eseguire la stessa operazione utilizzando un nuovo thread, anziché una coda. Ad ogni modo, questa tecnica migliorerà di scala, oltre ad essere in grado di recuperare più facilmente dall'errore.

Come sembra già sapere che la soluzione proposta non è la soluzione ideale, cercherò anche di rispondere alla tua domanda esatta. Potresti riuscire a far funzionare lo streaming HTTP per questo. Consiglierei di dare un'occhiata a http://railscasts.com/episodes/266-http-streaming.

+0

Grazie. Stavo davvero cercando di evitare di pagare per le dinamiche dei lavoratori di Heroku. – rdasxy

+0

Sì, quei componenti aggiuntivi si sommano rapidamente. –

+1

È possibile controllare https://github.com/lostboy/workless, per ottenere gli operai con un budget limitato. –

Problemi correlati