Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们如何配置shinyserver开源以支持并发用户_R_Concurrency_Shiny_Shiny Server - Fatal编程技术网

我们如何配置shinyserver开源以支持并发用户

我们如何配置shinyserver开源以支持并发用户,r,concurrency,shiny,shiny-server,R,Concurrency,Shiny,Shiny Server,我有一个R-shinny应用程序,我想使用开源解决方案托管它,以支持大约50个并发用户。我在RStudio上遇到了shinyserver,它可以用来将闪亮的应用部署到web上。我想使用shinyserver的开源版本 文档中说,我们可以使用简单的调度程序来定义并发连接的数量 简单调度器是开放环境中唯一可用的调度器 闪亮服务器的源代码版本。它将单个R进程与 单个闪亮的应用程序。此计划程序接受单个参数 它指定并发会话的最大数目。一旦这个 已达到数字,用户正在尝试在此服务器上创建新会话 应用程序将收到

我有一个R-shinny应用程序,我想使用开源解决方案托管它,以支持大约50个并发用户。我在RStudio上遇到了shinyserver,它可以用来将闪亮的应用部署到web上。我想使用shinyserver的开源版本

文档中说,我们可以使用简单的调度程序来定义并发连接的数量

简单调度器是开放环境中唯一可用的调度器 闪亮服务器的源代码版本。它将单个R进程与 单个闪亮的应用程序。此计划程序接受单个参数 它指定并发会话的最大数目。一旦这个 已达到数字,用户正在尝试在此服务器上创建新会话 应用程序将收到一个503错误页面

simple scheduler的文档中说

简单调度程序 一个基本的调度程序,将产生一个 每个应用程序的单线程R worker。如果没有调度程序 指定时,这是默认计划程序

它说开源shinyserver支持一个单线程R进程,但同时提到每个应用程序将有一个单线程R工作者。所以,如果我想为一个应用程序支持50个并发用户,我该如何实现呢?我是否需要在同一台服务器上创建50个应用程序实例,还是一个应用程序实例将由50个工作线程提供服务

此外,所提到的并发连接的默认数量是100。最高限额是多少


有人能解释一下我们是怎么做的吗?

你有几种选择,有优点也有缺点:

a) 使用shinyserver的经典简单闪亮应用程序 你有什么。正如您所读到的,在shinyserver中,闪亮的应用程序在单线程R worker中运行。这意味着,如果您有多个用户,所有并发用户都将在此R worker中与应用程序交互。如果应用程序有一些缓慢的计算(光栅计算、使用一些繁重数据进行预测、下载一个大文件…),并且一个用户要求任何这些,其他用户将体验到应用程序响应性的下降,因为他们需要等待大计算(没有人知道)完成。
总之,使用此选项,您可以发现用户多次点击输入或交互输出,应用程序似乎被卡住了。而
simple_调度器
在这里对您没有帮助,因为它声明了允许的并发用户数,而不是R线程数

b) 使用shinyserver的异步闪亮应用程序 你有一个很好的RStudio文档,解释如何使用
承诺
未来
扩展你闪亮的应用程序。根据应用程序的复杂程度,实现这一点可能从“非常容易”到“非常困难”。使用此解决方案会产生更多线程,但仅用于指定的计算。但这也有其局限性:

异步编程主要在应用程序有一个、两个或几个花费大量时间的点时有效

如果你的应用程序更复杂,你必须支持大量并发用户,那么你必须探索不同的选项

c) Shinproxy 正如我所说的:

ShinyProxy是您最喜欢的在企业环境中部署闪亮应用程序的方式。它具有用于LDAP身份验证和授权的内置功能,使保护闪亮流量(通过TLS)变得轻而易举,对闪亮应用程序的并发使用没有限制

Shinyproxy使用java(Springboot)为每个访问应用程序的用户启动应用程序的docker映像。这将导致每个用户使用一个应用程序,这是shinyserver无法做到的。
它的设置比shinyserver稍微复杂一点,但也可以作为一种选择(事实上,我已经在生产中使用了它,而且效果非常好)。
但是,请记住,即使他们声明“…(shinyproxy)在并发使用方面没有限制”,这也不是完全正确的。限制是您的服务器所支持的。每个应用程序都会消耗RAM和CPU,如果你的应用程序消耗了大量的RAM和CPU,那么用户的限制是由你的服务器资源决定的,相信我,你不想在你的生产服务器中触发OOM异常(在这里使用linux服务器)

d) Docker swarm,kubernetes。。。 假设您可以访问服务器集群,您可以使用容器化解决方案,如docker swarm和kubernetes,因为它们提供开箱即用的负载平衡(经过一些复杂的配置)。我还不精通那些方法,所以我无法深入了解它们。但最近我正在测试shinyproxy和docker swarm的组合,用shinyproxy、web服务器和db服务器(postgres)创建一个服务堆栈,这是非常有前景的

总结 你需要知道一个大概。您将拥有多少并发用户(~50,您已经完成了此操作)。
你需要熟悉你的应用程序。识别瓶颈和缓慢的步骤。如果可能的话,修复/优化它们,并检查应用程序在单个线程中的响应是否足以满足您预期的用户数量。
如果无法进行优化,请尝试
async
并再次检查。 如果这些都没有帮助,那么您需要像前面所说的那样深入研究更复杂的解决方案

希望这对你有帮助。当然,这里肯定还有其他没有说明的选项,但我真的不知道这些选项值得评论;)