Plumber: Tempo limite com uma solicitação longa

Criado em 25 ago. 2016  ·  3Comentários  ·  Fonte: rstudio/plumber

Oi !

Estamos gerando um longo relatório em PDF que leva cerca de 3 minutos e o expomos via Plumber.
A conexão HTTP fecha em torno de 1 minuto e 40 segundos (100 segundos).

Então temos a mensagem de erro lógico porque o encanador tenta enviar dados para uma conexão fechada:
ERROR: [on_request_read] connection reset by peer

Acho que pode estar relacionado ao #12 e a propósito https://github.com/rstudio/httpuv/issues/49

Existe uma maneira de corrigir isso no encanador? Pode ser enviando manualmente no Plumber algo assim:

Keep-Alive: timeout=300
Connection: Keep-Alive

Mas em qualquer caso, queremos evitar #12

Atenciosamente,
Emmanuel

Comentários muito úteis

Apenas no caso de alguém achar este problema relevante: fork ing funciona muito bem e é feito facilmente com o pacote parallel .

parallel <- function() {
    # Long running calculation here
    print("Sleeping...")
    Sys.sleep(10)
    print("Finished.")
    return(Sys.time())
}

#* <strong i="8">@get</strong> /parallel
parallelTest <- function() {
    parallel::mcparallel(parallel())
    return(TRUE)
}

Todos 3 comentários

Infelizmente, não estou familiarizado o suficiente com os componentes internos do httpuv para poder falar de forma inteligente sobre por que isso pode acontecer.

Para dar um passo para trás, porém, o padrão usual ao realizar esses tipos de tarefas de longa duração em outros sistemas é responder imediatamente à solicitação recebida e, em seguida, iniciar o trabalho de forma assíncrona. O cliente obtém algum ID em resposta à solicitação original e pode pesquisar para descobrir quando estiver concluído.

Infelizmente, R é single threaded, então isso é um pouco mais complicado. Mas se você estivesse suficientemente motivado você poderia olhar fork ing o processo R (veja os pacotes paralelos ou multicore) e então gerar o relatório em uma bifurcação do processo, deixando o processo pai disponível para responder às requisições da API (como clientes que estão pesquisando para ver se seu relatório é gerado).

Oi,

Aqui, otimizamos nosso código R para que não seja um problema na verdade. Mas o problema pode voltar em outros casos. Se eu encontrar uma solução, voltarei e publicarei aqui.

Apenas no caso de alguém achar este problema relevante: fork ing funciona muito bem e é feito facilmente com o pacote parallel .

parallel <- function() {
    # Long running calculation here
    print("Sleeping...")
    Sys.sleep(10)
    print("Finished.")
    return(Sys.time())
}

#* <strong i="8">@get</strong> /parallel
parallelTest <- function() {
    parallel::mcparallel(parallel())
    return(TRUE)
}
Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Jube-Dev picture Jube-Dev  ·  3Comentários

dmenne picture dmenne  ·  4Comentários

actuarialvoodoo picture actuarialvoodoo  ·  6Comentários

EDiLD picture EDiLD  ·  4Comentários

alexzaytsev-newsroomly picture alexzaytsev-newsroomly  ·  6Comentários