首页 > 解决方案 > Docker 是否足以满足大约 100 个连接的 Shiny 应用程序,还是我需要 Shiny Proxy?

问题描述

我正在寻找一个免费和开源的选项,可以同时为我的大约 100 名学生提供一个闪亮的应用程序。我尝试使用 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 名学生面前进行测试并进行即时测试)?

标签: rdockershinyshiny-servershinyproxy

解决方案


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

    Shiny-server 的开源版本允许您为应用程序提供服务,但它们都共享一个 R 进程。因此,如果您的应用程序有一个长时间运行的模拟,当一个用户运行它时,它会占用您的 R 线程并阻塞其他用户,直到它完成运行。

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

  • 如果您不关心它们都在同一个 URL,您可以只使用开源闪亮服务器的多个实例,例如在托管在您机器上不同端口的 docker 容器中。

  • 如果您想在应用程序实例之间进行负载平衡(在单个 URL 后水平扩展),您将需要 Shiny-server pro、ShinyProxy,或者使用带有粘性会话的负载平衡器。这是因为闪亮的应用程序在 R 会话中处理内存中的状态,因此如果您尝试将您的学生发送到一个 URL,并且该 URL 由您的应用程序的 n 个实例支持,但没有粘性保证,而不是单个学生的操作不一定每次都在同一个实例上,并且应用程序不会按您预期的那样工作。

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


推荐阅读