【问题标题】:Which one should I choose AMQP or XMPP for real-time browser-based game?对于基于浏览器的实时游戏,我应该选择 AMQP 还是 XMPP 哪一个?
【发布时间】:2011-02-25 17:24:24
【问题描述】:

我在 AMQP (RabbitMQ) 和 XMPP (eJabberd) 之间进行选择,用于我的基于浏览器的无闪存 javascript 驱动的实时回合制游戏。我不太了解 AMQP 和 XMPP 协议。我想使用 PHP 进行用户授权,并使用 MySQL 进行一些数据存储检索。据我所知,RabbitMQ 有 PHP 客户端,但 eJabberd 没有。

我的理解是javascript客户端调用PHP脚本并进行必要的处理,然后传递给AMQP或XMPP服务器将数据传递给对手玩家。 Wrox 有一本好书“Pro XMPP Programming with JS and jQuery”,但没有关于 PHP 的示例。所以以下是我的问题。

1) 哪种协议适合我的游戏?

2) 我应该仅仅因为它的 PHP 客户端支持而选择 RabbitMQ 吗?

【问题讨论】:

  • XAMPP/LAMP/etc 与客户端 JavaScript 无关。 Apache 和其他服务器正是您所需要的。
  • @Coronatus!感谢您的评论,但我确定您忽略了我的意思。我说的是可扩展消息传递和存在协议 (XMPP)。
  • 抱歉,我把“XMPP”误认为是“XAMPP”。忽略我的评论:)

标签: php xmpp rabbitmq amqp ejabberd


【解决方案1】:

AMQP 尚未达到 1.0 版,并且可能存在一些设计问题。有 PHP 的 XMPP 客户端,所以如果我是你,我会先尝试一下。

【讨论】:

    【解决方案2】:

    通过对 XMPP BOSH 使用 HTTP Bind 方法,我在 Javascript 中实现了 XMPP 客户端取得了相当大的成功。我不了解 AMQP,但对于客户端访问,我喜欢 XMPP。几句话为什么。

    ejabberd 已经包含 BOSH 支持,并且要与 Javascript(可能还有 Flash)一起使用,您只需指示您的服务器将请求重定向到您配置 ejabberd 以侦听 HTTP 请求的端口。 (甚至这只是因为当今浏览器中的 Javascript 安全模型禁止对不同域甚至不同端口的 Javascript 请求。)

    由于 XMPP 是一堆非常琐碎的小型 XML 文档,因此用您选择的任何语言对它们进行编码都应该相当容易。

    由于它得到广泛支持,您或许可以避免要求您的用户注册您的服务,他们一定会喜欢的。

    实施 XMPP 意味着您可以轻松地为您的游戏添加即时消息支持,并与 Jabber 网络的其余部分(包括 Google Talk)联合。

    由于我对 AMQP 一无所知,因此无法比较它们——但我可以说为什么我在未来的多人游戏项目中总是首先考虑 XMPP。


    我个人选择ejabberd 的原因很简单——在 Debian 上安装和配置超级容易。我对 Erlang 和 Java 几乎完全不熟悉;然而,我对 Erlang 的理解是,它使可伸缩性很容易实现,ejabberd 的人说他们已经实现了。

    如果你想做服务器端的逻辑检查,恐怕我不知道有什么好的方法。我会使用代理 PHP 脚本对传入的 XMPP BOSH 消息进行完整性检查,然后将其转发到服务器,而不是仅通过 Apache 的 mod_rewrite 转发它。

    如上所述,您肯定需要进行某种代理(使用mod_rewrite 或使用 PHP 或其他方式),因为 XMPP 服务器将侦听与“主”网络服务器不同的端口,并且Javascript 跨域安全模型不允许在不同的端口上执行XMLHTTPRequest

    因此,在将 BOSH 请求中继到您选择的 XMPP 服务器时,可能最容易完成完整性检查。深入研究服务器软件可能不是进行此类检查的最佳方式。这将花费很长时间,并且可能会使与游戏的其余部分集成变得更加困难。

    另外,我偶然发现了一个提到 XMPP components and ejabberd modules 的答案。这对我来说也是一本有趣的书。

    祝你好运,完成后请务必在游戏名称中发表评论——我很乐意看到它:-)


    我刚刚注意到有人在您的帖子上发布了very similar question。它的答案包含一些更有趣的信息。


    关于将 XMPP 与 Flash 一起使用:

    您仍然可以将 HTTP 绑定 (BOSH) 与 Flash 一起使用。事实上,虽然 HTTP 绑定允许 Javascript 访问 XMPP,但它是为各种应用程序设计的,例如经常中断的移动连接。

    我主要通过观察基于 Web 的客户端 JWChat 和 ejabberd 之间的通信(有关 BOSH 的信息)以及跨平台客户端 Psi 和 ejabberd 之间的通信(有关协议本身的信息)来弄清楚如何建立连接。使用 JWChat 和 WebKit 的 Web Inspector 或使用 Firebug for Firefox,可以轻松跟踪正在向服务器执行的 XMLHttpRequest。使用 Psi,可以打开 XML 控制台并读取通信日志。结合使用您选择的语言对客户端进行原型设计,学习 BOSH 和 XMPP 变得非常容易。

    此外,以下 XEP 也很有用:XEP-0124XEP-0206

    我现在正在阅读的 O'Reilly 书,"XMPP: The Definitive Guide"(P. Saint-Andre、Kevin Smith、Remko Tronçon;便宜得多 on Apple's App Store)也让您感觉“为什么事情会按照他们的方式完成are",并记录了 XMPP 的许多小事和各种应用。

    之后,实现基于 BOSH 的客户端可能会变得相当容易。除了让按钮播放和暂停之外,我没有使用 Flash 编码的经验,所以请谨慎对待:-)

    【讨论】:

    • 您好,感谢您的回复。由于我不了解Erlang,所以我担心在为带有模块的游戏编写服务器规则时会遇到问题。您有什么理由必须选择 Ejabberd 而不是基于 Java 的 OpenFire?我对 Java 知之甚少,所以这两种语言我都不熟悉。
    • 哦,再次感谢您的热心回复。由于我的游戏要求,javascript 是不够的,所以我现在正在尝试使用 Flash。但是,我在商业套接字服务器(SmartFox、ElectroServer)或使用 XMPP 之间做出选择,但很少有关于 XMPP 和 Flash 的示例和教程。无论如何,我什么时候可以发布东西,你会先通知你的 :)
    • 我将再次编辑答案以提供更多信息。它似乎不适合这个小 cmets 盒子:)
    【解决方案3】:

    正如有人提到的,您需要考虑客户端到服务器的部分;这似乎更重要。

    听起来您已经拥有关于该主题的最佳书籍(Jack Moffit 的 XMPP + JS 书籍),我肯定会说这是可以使用的技术。

    您还可以获得用户身份验证、加密和所有许多 XMPP 协议扩展,正如本书将描述的那样。

    尽管我不能推荐任何 PHP-XMPP 客户端,但我认为您不一定会拥有与 AMQP 相同级别的开箱即用功能。

    此外,如果您精通其他语言,并且根据所需的游戏逻辑量,您可以编写 XMPP 服务器组件。有关信息,请参阅有关 XMPP + 游戏的先前问题:
    XMPP C# Interaction

    【讨论】:

      猜你喜欢
      • 2011-03-11
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多