了解托管在 Shiny Server 上的 R Shiny 应用程序的可扩展性

Understanding the scalability of RShiny apps hosted on ShinyServer

我正在为一个我正在考虑转变为一家公司的项目构建一系列交互式闪亮网络应用程序。我的背景是数据科学,我在网络应用程序/服务器方面没有太多经验,但这些都是我在项目中考虑的重要方面。我目前有一个安装了 ShinyServer(免费、开源)的 Amazon Linux AMI EC2 实例,我目前正在那里托管我的 Web 应用程序的早期版本。到目前为止一切正常,但我还没有建立链接 public。

  1. 我的第一个问题是是否有人知道我是否不可避免地存在某些限制(可扩展性限制、与数据库集成的限制、安全/身份验证限制等)运行 开始使用 RShiny 应用程序和 ShinyServer? 我还没有听说过许多成功的、超级流行的网络应用程序是托管在 ShinyServer 上的闪亮应用程序,但我的感觉是 ShinyServer 主要用于托管 RShiny 应用程序仅在少数人之间共享(即在公司的团队成员之间共享。)。根据此线程 - Does R-Server or Shiny Server create a new R process/instance for each user? - 我特别担心我的应用程序将无法同时处理数千个用户,因为无论应用程序的并发用户数量如何,都只会为应用程序创建 1 个 R 进程。如果我打算扩展到超过数百或数千个用户,通过 ShinyServer pro 拥有 10-20 个进程可能也无法解决问题。我还注意到 ShinyServer Pro 每年 运行 给我 1 万美元的不可忽视的收入。

  2. 我的第二个问题是 RShiny 应用程序是否可以使用其他服务器技术部署,例如 Heroku。我看到了这个 git 中心页面 (https://github.com/virtualstaticvoid/heroku-buildpack-r/tree/heroku-16),但还没有深入研究它。有人告诉我,heroku 可以很容易地更新代码在 github (git push heroku:master) 上的应用程序的版本,等等。

  3. 第三个问题涉及我的一些具体考虑。特别是,我目前正在编写一个脚本,该脚本从 API 查询数据并将该数据写入我的(尚未设置)数据库。这是我的应用程序使用的数据,我有兴趣让应用程序在数据库更新时实时更新,而不需要用户刷新网页。我的一个伙伴建议 AJAX 这种类型的异步行为,看起来这在 R 中可能是可能的,像这样 (https://github.com/daattali/advanced-shiny/tree/master/api-ajax)。

抱歉,这个问题太繁琐了,但我希望它不会被关闭,因为我认为它很有教育意义。任何建议/来源/指出我正确的方向将不胜感激。

卡诺维斯,

我建议您查看以下 RStudio/AWS 支持文章。要扩展闪亮的服务器,您需要考虑使用负载均衡器:

Shiny 是一个很棒的平台,他们的支持非常棒。我建议您给他们打电话 - 他们一定会帮助回答您的问题。

也就是说,如果您的计划是创建一个可扩展的网站来支持成千上万或数十万人,那么我的感觉是建议您也查看并考虑使用 D3.js in conjunction with react.js or Angular.js, not forgetting to mention node.js

我的感觉是,您正在查看连接到逻辑引擎和可视化前端的后端数据库。如果您正在寻找一个很好的用法概述,请查看以下网页和 git repo [有点过时但有用]:

希望以上内容能为您指明正确的方向。

我想提供一些与您的第二个问题相关的注释:是的,您可以使用提到的 buildback 在 heroku 上部署闪亮的应用程序。

我和你有类似的情况(问自己以可扩展的方式为 Shiny 应用程序提供服务的可能方式)并决定采用 "heroku way"。

在使用上述 buildpack 将应用程序部署到 heroku 时,您可能会发现这些提示很有用:

  • Heroku 尝试 "guess" 如何执行您的应用程序。但是您也可以将一个名为 Procfile 的特殊文件添加到您的应用程序中,以控制您要为应用程序执行的进程命令。在我的例子中,我使用了 web: R -f ~/run.R --gui-none --no-save,这意味着一个名为 run.R 的文件被传递给 Web 服务器进程的 R 可执行文件

  • heroku 上的堆栈基于 Ubuntu。如果你需要额外的 deb-packages,你可以创建另一个名为 Aptfile 的特殊文件并在其中添加包名称,heroku 然后会自动为你安装这些(我需要它 RPostgreSQL

  • 您可以添加另一个名为 init.R 的特殊文件,并根据需要安装所有 R 包,就像您习惯的那样,即 install.packages 等。您也可以在此文件中添加初始配置material。

作为 运行 示例,here 是我为自己编写的示例玩具应用程序,用于记住 "full-stack" 闪亮应用程序的外观,包括与 heroku 的兼容性。

  1. 对于大量并发用户,使用像 nginx 这样的负载均衡器并启用应用程序的自动缩放,例如通过 Kubernetes。

  2. 您可以在 Heroku 上部署您的应用程序。在付费层,它包括应用程序的 NoOps 自动缩放。请参阅本教程,了解如何在 Heroku 上的 Docker 容器中部署 Shiny 应用程序:https://medium.com/analytics-vidhya/deploying-an-r-shiny-app-on-heroku-free-tier-b31003858b68

  3. 您可以使用 reactivePoll() 在 Shiny 服务器逻辑中查询 table 最后更新时间戳,如果它发生变化则重新运行您的数据库查询。它不是“实时”的,但如果您将时间间隔设置得足够小,则取决于您的应用程序是否足够接近。