Docker 是否足以满足具有约 100 个连接的 Shiny 应用程序,或者我是否需要 Shiny Proxy?

Will Docker suffice for a Shiny app with ~100 connections or do I need Shiny Proxy?

我正在寻找一个免费和开源的选项来同时为大约 100 名学生提供 Shiny 应用程序。我试图用 Shiny Server Open 来做到这一点,但它受到了限制。用户收到类似

的消息
Too Many Users

Sorry, but this application has exceeded its quota of concurrent users. Please try again later.

搜索该错误消息后,我现在知道我可以增加并发连接数,但我担心 R 的单线程性会导致瓶颈。我知道 Shiny Proxy 并且我一直在对此进行试验,但它似乎可能包含我不需要的额外复杂层。

我之前用 Docker 服务过 Shiny 应用程序(但不是针对这么大的受众),所以我想知道它是否足够。

我的问题是:如果我不需要身份验证(用户登录),Docker 是否足以满足约 100 个同时连接的单页应用程序?或者我真的需要 Shiny Proxy 吗?


推论:我如何测试它并确保它能正常工作(除了在 100 名学生面前 class 和即时测试之外)?

  • 你关心它们是否共享相同的底层 R 进程吗?

    shiny-server 的 open-source 版本允许您为应用程序提供服务,但它们都共享一个 R 进程。因此,如果您的应用程序有一个 long-running 模拟,当一个用户运行它时,它会 tie-up 您的 R 线程并阻止其他用户,直到它完成 运行。

    我不知道并发连接有限制,如果你不介意他们如上所述共享 R 进程。您可以尝试增加 simple_scheduler 设置,请参阅 shiny-server.conf 文档中的第 3.1.2 节简单调度程序(通常位于 /etc/shiny-server/)。

  • 如果您不关心它们是否都相同 URL,您可以使用 open-source shiny-server 的多个实例,例如在 docker 个容器中托管在您机器上的不同端口。

  • 如果您想在应用程序实例之间执行类似 load-balance 的操作(在单个 URL 后水平缩放),您需要 shiny-server pro,ShinyProxy,或者使用 sticky-sessions 的负载均衡器。这是因为闪亮的应用程序在 R session 中处理状态 in-memory,因此如果您尝试将学生发送到 URL 并且 URL 由您的 n 个实例支持应用程序,但没有粘性保证,单个学生的操作不一定每次都在同一实例上,并且应用程序不会像您预期的那样工作。

    Shiny-Server pro 和 ShinyProxy 使用 cookie 和 headers 为您处理这种粘性。根据您的 cloud-services 提供商,他们可能支持浏览器 cookie,只要您不需要您的学生能够使用不同的实例打开您的应用程序的多个选项卡,它就可以工作。