可以通过网页在客户端上托管API吗?

时间:2020-04-18 21:59:46

标签: google-chrome browser localhost client distributed-computing

我对组织一场编程竞赛很感兴趣,在该竞赛中,人们用他们喜欢在普通游戏中与计算机(以及最终与其他计算机竞争,但稍后再讨论)竞争的任何语言编写机器人。这个想法是,机器人将随着他们的举动对RESTful API进行调用,并通过计算机的举动和电路板的状态接收响应,直到游戏结束。

这很重要:我不想托管自己的服务器来处理这些请求,这既是因为处理负载平衡很头疼,又是因为一旦它变得流行起来,我就没有足够的资金来托管跨多个节点的高可用性服务器。

如果我们假设计算机的策略可以放入合理大小的最小JavaScript文件中,这对于Mancala之类的游戏来说是完全合理的,那么如果用户选择程序可以与网页交互,该网页在计算机上打开时可以接收并响应简单的本地API调用。从逻辑上讲这可能是不可能的,但我认为应该应该

为了详细说明,让我们以Mancala为例。 RESTful调用有一种公认的语法,在这种情况下,该语法只是1到6之间的数字。游戏会跟踪棋盘的状态,进行移动,并以新的棋盘做出响应-14-整数数组-以及出于用户目的在移动时将其选中的bin。广告无限。

比方说,用户已经用Python 3-SuzysMancalaBot.py编写了一个bot,可以根据董事会的状态来选择自己的举动。在我这一边,mancala.min.js可能适合一个中等难度的直截了当的漫游器,当您访问游戏页面时浏览器会加载它。这里没有钱可乘,因此使用精巧的JS交付计算机bot并不是问题。游戏非常复杂,以至于无法预先计算每个状态并创建静态API。

最明显的解决方案是将Express服务器托管在EC2上,或者在用户创建ID后可以响应以下任意数量的Python(或Ruby,Node或what-have-you)调用的地方:下一步。由于理想情况下Suzy希望在许多试验中对其机器人进行测试,因此即使一个用户也会产生1000次呼叫,并且受到响应延迟的限制。

如果Python机器人可以以某种方式调用页面的本地实例,该实例包含模拟游戏的所有逻辑和必要的内存,那么它将更快,并为我节省了更少的开销和费用。令人沮丧的是:所有必需的计算就在客户端上,但是Python如何与Chrome对话? (我不介意仅限于Chrome。)

我看到有一个Chrome plugin for spinning up localhosts。虽然拥有不需要的解决方案会很棒,但是我愿意编写一个插件。尽管我认为这将要求用户下载游戏的整个服务器环境并启动服务器,但这比我希望的工作还要多。

这里的目标似乎可能是可行的:用户来到我的网站,使用唯一的本地ID开始新游戏,然后她的机器人与该页面进行互动。浏览器充当服务器,跟踪游戏状态并响应下一个动作。我所需要做的只是弄清楚如何让浏览器进行聆听和交谈。

我能想到的唯一替代解决方案是用户将他或她的代码上载到客户端-从来没有上载到客户端,并且页面本身执行了游戏。 (如果它永远不会跨越站点,那不是跨站点脚本,并且几乎没有动机去入侵自己!)我想这将需要将每种语言移植到JS,除非有某种方式可以使Web页运行Python(以及Ruby和Rust) ,等等)。我从未尝试过让页面执行本地上传的JS,这可能是一场安全噩梦。我不知道。

我能想到的最后一个解决方案是,用户有责任旋转localhost并将端点输入页面,然后与本地主机对话以进行播放。再次,这比我为用户所希望的工作还要多,并且可能是CORS的噩梦-我从来没有机会测试过与本地主机通信时AJAX调用的工作方式,这可能需要服务由于网站是通过SSL进行的。

我希望至少已经充分描述了这个难题。如果没有别的,这是一个分布式处理的有趣问题。

0 个答案:

没有答案