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

Posted

技术标签:

【中文标题】了解 Shiny Server 上托管的 R Shiny 应用程序的可扩展性【英文标题】:Understanding the scalability of RShiny apps hosted on ShinyServer 【发布时间】:2018-05-23 08:11:41 【问题描述】:

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

    我的第一个问题是 是否有人知道我在使用 RShiny 应用程序和 ShinyServer 时是否会不可避免地遇到某些限制(可扩展性限制、与数据库的集成限制、安全/身份验证限制等)? 我还没有听说过很多成功的、超级流行的 Web 应用程序是托管在 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 万美元。

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

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

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

【问题讨论】:

【参考方案1】:

卡诺维斯,

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

RStudio

https://shiny.rstudio.com/articles/scaling-and-tuning.html https://support.rstudio.com/hc/en-us/articles/220546267-Scaling-and-Performance-Tuning-Applications-in-Shiny-Server-Pro https://support.rstudio.com/hc/en-us/articles/217801438-Can-I-load-balance-across-multiple-nodes-running-Shiny-Server-Pro-

AWS

https://aws.amazon.com/blogs/big-data/running-r-on-aws/

博客文章:

http://mgritts.github.io/2016/07/08/shiny-aws/

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

也就是说,如果您的计划是创建一个可支持数千或数十万人的可扩展网站,那么我的感觉是建议您也查看并考虑将 D3.js 与 react.js 或 Angular.js 结合使用,别忘了提到node.js。

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

https://anmolkoul.wordpress.com/2015/06/05/interactive-data-visualization-using-d3-js-dc-js-nodejs-and-mongodb/ https://github.com/anmolkoul/node-dc-mongo

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

【讨论】:

【参考方案2】:

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

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

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

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

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

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

作为一个运行示例,here 是我为自己编写的一个示例玩具应用程序,用于记住“全栈”闪亮应用程序的外观,包括与 heroku 的兼容性。

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于了解 Shiny Server 上托管的 R Shiny 应用程序的可扩展性的主要内容,如果未能解决你的问题,请参考以下文章

在 Ubuntu Server 上将 .R 文件转换为实际的 Shiny 应用程序

使用我的R管道工程API在EC2实例上托管的连接问题

如何安全地将 EC2 托管的 Shiny 应用程序集成到 asp.net 项目中

是否可以在 Github Pages 上托管交互式 R Markdown 文件?

如何将数据从 Heroku 上托管的 Node.js 应用程序发送到托管在完全独立(Cpanel)服务器上的 PHP 文件?

在闪亮服务器上托管 html 页面