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

fab*_*osa 5 php connection-pooling amazon-ec2 polling

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

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

我最初的做法是:

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

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

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

pre*_*mer 6

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

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

考虑以下:

  1. 将(现已过期的)数据传递给客户端,包括时间戳
  2. 调用flush(); (测试以确保页面完全呈现,您可能需要发送空格或其他东西来填充缓冲区,具体取决于Web服务器的配置方式.附加flush(); sleep(4); echo "hi";到php脚本应该是一种简单的测试方法.
  3. 调用ignore user abort(http://php.net/manual/en/function.ignore-user-abort.php),这样无论用户做什么,你的客户端都会继续执行
  4. 轮询所有服务器,更新您的文件
  5. 在尝试通过AJAX更新更新的统计数据之前,客户端会等待一段合适的时间.

是的,客户端最终会在请求过程中花费很长时间,但这不会影响他们的页面加载,因此他们可能甚至都没有注意到.