了解ShinyServer上托管的RShiny应用程序的可扩展性

时间:2017-12-09 04:07:48

标签: r web-applications shiny shiny-server

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

  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每年会给我带来一个不可忽视的10万美元。

  2. 我的第二个问题是是否可以使用其他服务器技术部署RShiny应用程序,例如Heroku 。我遇到了这个github页面(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)。

  4. 很抱歉这是一个非常复杂的问题,但我希望它不会被关闭,因为我觉得它很有教育意义。任何建议/来源/指出我正确的方向将在此非常感激。

3 个答案:

答案 0 :(得分:4)

Canovice,

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

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

如果你的计划是创建一个可以支持成千上万或数十万人的可扩展网站,那么我的意思是建议你也审核并考虑将D3.jsreact.js结合使用或Angular.js,不要忘记提及node.js

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

我希望以上指出你正确的方向。

答案 1 :(得分:1)

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

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

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

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

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

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

作为一个运行示例,here是我为自己编写的一个示例玩具应用程序,用于记住"全栈"闪亮的应用程序可能看起来像,包括与heroku的兼容性。

答案 2 :(得分:0)

  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服务器逻辑中查询表的最后更新时间戳,如果数据库查询已更改,则重新运行它。它不是“实时”的,但是如果您将时间间隔设置得很小,则取决于您的应用程序是否足够接近。