Keep shiny app running in shiny server (no greying out)

shiny
shiny-server
#1

I have deployed a shiny application with shiny server open source.

The app should not grey out as long as a user has the browser tab open. This is something people are not used to when interacting with websites.

So I set the app_idle_timeout option to 0. This seems to work, but now every 30 seconds a popup is opening for some millisesonds in the bottom left corner (It says 'Attempting to reconnect'). Is there a way to hide this popup because it is distracting?

1 Like

#2

I'm curious if the websocket is timing out due to lack of traffic, so it restarts itself every 30s.

Try putting a "clock" or something on the page that updates frequently. This would constantly keep the page updating and traffic on the websocket.

0 Likes

#3

It is strange and I do not know, why this timeouts happen. It does not matter if the user interacts with the app or does nothing. Every 30 seconds there is a disconnect.

I think I misunderstood the app_idle_timeout option as this does not have something to do with it, right? It only affects, what happens after a user closes the browser tab, or?

Based on a stackoverflow answer I added

  autoInvalidate <- reactiveTimer(10000)
  observe({
    autoInvalidate()
    cat(".")
  })

But it does not help.

0 Likes

#4

I believe that would keep the app thinking, but I believe you're losing the websocket connection between the app and the browser.

Mixed with your app_idle_timeout and the app below, I believe it should not quit.

ui <- fluidPage(
  "Am I losing connection?",
  tags$div(style = "position: absolute; top: -100px;",
    textOutput("clock")
  )
)
server <- function(input, output) {
  output$clock <- renderText({
    invalidateLater(5000)
    Sys.time()
  })
}
shinyApp(ui = ui, server = server)

The clock above will update every 5 seconds to a value that is above the window. This css prevents users from seeing the value, but since something is sent every 5 seconds, the websocket is kept alive.

Does this app show the timeout for you?

0 Likes

#5

@barret Thanks, but it does not help. I think this issue is directly linked to the way I deployed the shiny server. I am running this as a Kubernetes Deployment in Google Cloud. An ingress with a https load balancer makes the app available to the outside. In the documentation in https://cloud.google.com/load-balancing/docs/https/?hl=en#timeouts_and_retries I found that there is a 30 second timeout:

A configurable response timeout , which represents the amount of time the load balancer will wait for your backend to return a complete response.The default value is 30 seconds. Consider increasing this timeout under these circumstances:

  • If you expect a backend to take longer to return HTTP responses, or
  • If the connection is upgraded to a WebSocket.

When I change this timeout to 45 seconds, I will see the disconnects and reconnects after 45 seconds. So it's directly linked to this setting. But I still do not understand why do I loose the websocket connection between app and browser at all and what can be done to prevent this?

These are the configuration files of my ingress and service:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: shinyapp-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "my-ip"
spec:
  tls:
  - secretName: sslcerts
  backend:
    serviceName: shinyapp-service
    servicePort: 80

and for the service:

kind: Service
apiVersion: v1
metadata:
  name: shinyapp-service
spec:
  selector:
    app: shinyapp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: NodePort
  sessionAffinity: ClientIP
0 Likes

#6

@markusdumke I see this in their docs as well: https://cloud.google.com/load-balancing/docs/https/#timeouts_and_retries

Maybe change it to 3600 (1 hr) in the Cloud config? Seeing the message once an hour isn't too bad.

0 Likes