google-app-engine - Google Cloud 上的实时游戏 : Channel API or Compute Engine?

标签 google-app-engine websocket channel-api google-compute-engine

我们需要开发一款具有实时性能的多人游戏。 这需要在全局范围内运行(美国、欧洲、亚洲的服务器),并支持巨大的流量。使用 Google Cloud 服务进行托管。

我们正在考虑 Jam with Chrome、Chrome Maze 或 Cube Slam 等引用。

游戏:

  • 2 名玩家挑战一场比赛
  • 我们需要同时显示两个玩家的进度
  • 每场比赛可以持续大约 30 到 45 秒

托管:

我们显然会在 AppEngine 上托管网站,自动缩放, 但正在考虑实时服务器的 2 种解决方案:

  1. 将 websocket 服务器与 Compute Engine 结合使用

    就像他们用 Chrome、Maze 等为 Jam 所做的那样。
    开发我们自己的 websocket 服务器(技术待定),部署在欧洲、美国、亚洲的数据中心,处理扩展、它们之间的同步、服务器和客户端的计算延迟问题等。
    但这在技术上非常具有挑战性,因为我们的时间非常紧迫,而且现在缺少管理系统和网络人员。

  2. 或者使用 Channel API

    我们理解它不是一个websocket平台,实时性较低。
    但这对我们和我们拥有的时间来说会更加简单和安全。
    所以,我们也想了解更多。

无论如何,我们认为我们可以在前端使用一些图形技巧,使其看起来像实时的,但这实际上取决于我们是否有 100~500 毫秒或 500 毫秒~10 秒的延迟。

一些问题:

  • 不同解决方案的延迟范围值是什么样的?
    (Jam w/Chrome 使用 GCE 得到 100ms,Channel API 可以达到几秒吗?)
  • Channel API 服务器将如何处理高流量,缩放是如何工作的,延迟会不会非常高? ( channel 文档中没有相关信息?)
  • 如果法国人和美国人一起玩,连接到不同的服务器,等待他们同步,怎么办?
  • 有什么建议或经验可以分享吗?
  • 有什么有趣的阅读或观看吗? (看过一些但不是很准确)
  • 还有其他解决方案吗?

感谢您的任何帮助评论!

编辑:

  • 只有 2 名玩家连接在一起,可能来自不同的世界区域,不需要广播。
  • 我们可以找到一些前端技巧来避免服务器端处理。这是 2 名玩家之间的比赛,所以我们实际上只需要比较他们的进度,真正的获胜者决议并不那么重要,因为没有真正的东西可以赢,这更有趣。

最佳答案

如果您需要一个服务器来处理数据:

我肯定会在 Compute Engine 上使用 websockets!

Channels API 慢得多,而且非常不可预测(延迟因消息而异)!数据必须转到 Channels 服务器,后者将其发送到 App Engine 实例,App Engine 实例必须向 Channels 服务器发出请求,后者会将消息推送到客户端。如果你想降低延迟,那有太多事情要做!

这是一个 Channels API 压力测试:
http://channelapistresstest.appspot.com/
尝试多次点击“发送 5”按钮,您会看到延迟数字上升到几秒。

Channels API 在重负载下也非常昂贵(它可能无法很好地扩展,即使 Google 当然可以通过更多实例解决这个问题)。

要降低延迟,地理定位非常重要。使用 Compute Engine 上的 websocket 服务器,您可以将欧洲访问者发送到谷歌的欧洲数据中心,将美国访问者发送到美国数据中心(使用 AppEngine 将提供的地理位置 header )。您无法使用 Channels API(或应用程序引擎,您的所有消息都通过它进行中继)进行此类控制。也许 Google 有 Channels API 的边缘服务器(我不知道),但如果您的 AppEngine 实例在地球的另一边,那没关系。

如果您不需要服务器来处理数据:

您应该与 WebRTC 建立点对点连接,直接在用户的浏览器之间发送内容。那就是 Cube Slam 所做的。 (WebRTC 需要一些初始握手(“信号”),以便两个对等点可以找到对方,并且 Channels API 可以很好地进行握手,这只是建立点对点连接的几条消息。)

WebRTC DataChannels API 将为您提供一个类似 websocket 的漂亮界面,例如 channel.onmessage = function(e) { yadayada()... };channel.send("yadayada "); 在对等点之间发送您的数据。

有时,WebRTC 无法建立点对点连接。然后它将回退到 TURN 服务器,该服务器在对等点之间中继流量。 Cube Slam 使用在 ComputeEngine 上运行的 TURN 服务器(在欧洲和美国都是为了降低延迟),但这只是在无法实现真正​​的点对点时的备用方法。

关于google-app-engine - Google Cloud 上的实时游戏 : Channel API or Compute Engine?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17094626/

相关文章:

javascript - 为什么使用 App Engine Channel API 时需要进行如此多的 XHR 轮询

python - 如何在 GAE 上定期运行 Python 函数

google-app-engine - 谷歌应用引擎 : print "self.request.path"

google-app-engine - 需要以编程方式访问 GAE 日志

google-app-engine - 是否有 GWT 库与新的 AppEngine Channel API 接口(interface)

c# - HttpClient 连接状态在使用一段时间后保持在 TIME_WAIT 导致套接字异常

javascript - PHP 棘轮和 WebRTC

python - GAE组织数据结构问题

python - 如何选择 gae 实体的 key_name?

scala - Play2创建客户端websocket