网站架构设计需要从外部服务器进行实时轮询

时间:2011-10-21 01:46:37

标签: php amazon-ec2 connection-pooling polling

我在 N ec2服务器中运行游戏,每个服务器都有自己的玩家(假设它是每个服务器内部的独立游戏)。

为此游戏开发前端的最佳方法是什么,这样我就可以获得所有服务器上所有玩家的近实时信息。

我最初的做法是:

  • 有一个通用的共享托管php网站从每个服务器轮询数据(每个服务器1个套接字)。因为大多数共享解决方案并不真正提供永久套接字,所以这需要我每隔5秒左右创建和处理一个连接。因为没有具有该粒度的cronjob,我最终将使用一个不幸的客户端的请求来进行此更新。这里有很多错误,让我们考虑这是最糟糕的情况。

  • 最好的方案(我猜)是用一些基于python / ruby​​ / php web的前端创建小ec2实例,服务器应用程序专为轮询和保存网站数据库上的服务器的数据而设计。虽然这应该可以正常工作,但我一直在寻找一些解决方案,我不需要花那么多钱(即使微型实例对于这样的宠物项目来说也很昂贵)。

对此最好和最便宜的解决方案是什么?

2 个答案:

答案 0 :(得分:6)

是否有理由不能让一个服务器轮询其他服务器,将结果存储在json文件中,然后将该文件推送到相关的Web服务器?然后,客户可以使用ajax近乎实时地更新列表。

如果您不控制游戏服务器,我会将更新json的工作传递给其中一个随机客户端请求。它并没有你想象的那么糟糕。

请考虑以下事项:

  1. 向客户端发送(现已过期)数据,包括时间戳
  2. 调用flush();(测试以确保页面完全呈现,您可能需要发送空格或其他东西来填充缓冲区,具体取决于Web服务器的配置方式。将flush(); sleep(4); echo "hi";附加到php脚本应该是一种简单的测试方法。
  3. 调用忽略用户中止(http://php.net/manual/en/function.ignore-user-abort.php),这样无论用户做什么,您的客户端都将继续执行
  4. 轮询所有服务器,更新文件
  5. 客户端在尝试通过AJAX更新更新的统计信息之前会等待一段合适的时间。
  6. 是的,客户端最终会在请求过程中花费很长时间,但它不会影响他们的页面加载,因此他们可能甚至都没有注意到。

答案 1 :(得分:3)

您不提供做出决定所需的信息。这取决于玩家数量,服务器数量,游戏数量,玩家之间的通信,每个游戏/玩家所需的内存和CPU数量,通信渠道的延迟和传输速率,玩家的地理分布,所需的更新速率,允许球员运动,相互见证。数据库最初应该是解决方案的一部分,因为它只会增加额外的延迟和复杂性。首先实时工作

真的很便宜就是使用netnews。