需要从外部服务器进行实时轮询的网站架构设计
Posted
技术标签:
【中文标题】需要从外部服务器进行实时轮询的网站架构设计【英文标题】:Website architecture design requiring real-time polling from external servers 【发布时间】:2011-10-21 01:46:37 【问题描述】:我有一个游戏在 N 个 ec2 服务器中运行,每个服务器里面都有自己的玩家(假设它在每个服务器中都是独立的游戏)。
为这款游戏开发前端的最佳方式是什么,让我能够获得所有服务器上所有玩家的近乎实时的信息。
我最初的做法是:
有一个通用的共享主机 php 网站轮询来自每台服务器的数据(每台服务器 1 个套接字)。因为大多数共享解决方案并没有真正提供永久套接字,所以这需要我每 5 秒左右创建和处理一个连接。因为没有具有这种粒度的 cronjob,所以我最终会使用一个不幸的客户的请求来进行此更新。这里有很多错误,让我们考虑这是最坏的情况。
1234563 .尽管这应该可以正常工作,但我一直在寻找一些不需要花那么多钱的解决方案(对于这样的宠物项目,即使是微型实例也很昂贵)。什么是最好和最便宜的解决方案?
【问题讨论】:
如果你想比 cron 更频繁地轮询,为什么不写一个小守护进程来做呢? 弗兰克,这是我最好的方案,使它成为一个更昂贵的设计,因为我需要一个允许守护进程运行的服务器 (VPS/Ec2) 【参考方案1】:您是否有理由不能让一台服务器轮询其他服务器,将结果存储在 json 文件中,然后将该文件推送到相关的 Web 服务器?然后,客户可以很容易地使用 ajax 近乎实时地更新列表。
如果您不控制游戏服务器,我会将更新 json 的工作交给随机客户端请求之一。虽然它没有你想的那么糟糕。
考虑以下几点:
-
向客户端提供(现已过期)数据,包括时间戳
调用
flush();
(测试以确保页面完全呈现,您可能需要发送空格或其他内容来填充缓冲区,具体取决于网络服务器的配置方式。将flush(); sleep(4); echo "hi";
附加到php脚本应该很容易测试方法。
调用 ignore user abort (http://php.net/manual/en/function.ignore-user-abort.php),这样无论用户做什么,您的客户端都会继续执行
轮询所有服务器,更新您的文件
客户端在尝试通过 AJAX 更新更新的统计信息之前等待适当的时间。
是的,客户端确实会导致请求花费很长时间,但这不会影响他们的页面加载,因此他们甚至可能不会注意到。
【讨论】:
【参考方案2】:您没有提供做出决定所需的信息。这取决于玩家数量、服务器数量、游戏数量、玩家之间的通信、每个游戏/玩家所需的内存和 CPU 量、通信渠道的延迟和传输速率、玩家的地理分布、所需的更新速率,允许球员移动,相互可见。数据库最初应该不成为解决方案的一部分,因为它只会增加额外的延迟和复杂性。首先让它工作实时。
为此使用网络新闻真的很便宜。
【讨论】:
以上是关于需要从外部服务器进行实时轮询的网站架构设计的主要内容,如果未能解决你的问题,请参考以下文章
如何让 GraphQL 在不进行轮询的情况下从数据库中获取实时/新数据?
服务器推Comet长轮询的方式与普通AJAX不断请求的方式的区别