题
我感到有点困惑——大约 24 小时以来,我一直在思考在我的项目中使用哪种群组广播技术。
基本上,我需要的是:
- 创建组(通过某些后端进程)
- 任何客户端广播消息(1:N、N:N)
- (可能)直接消息 (1:1)
- (重要)使用我自己的后端对客户端进行身份验证/授权(例如,通过某种 HTTP API)
- 能够通过后端进程(或服务器插件)踢出特定的客户端
这是我将得到的:
- Ruby 或 Haxe 中的后端相关进程
- JS+Haxe(Flash9) 中的前端 — 在浏览器中,所以 理想地 通过 80/443 进行通信,但不一定。
因此,这项技术必须能够在 Haxe for Flash(最好是 Ruby)中轻松访问。
我一直在思考:RabbitMQ(或 OpenAMQ)、RabbitMQ+STOMP、ejabberd、ejabberd+BOSH、juggernaut(需要为其编写 Haxe lib)。
有什么想法/建议吗?
解决方案
如果您打算进行 Flash 开发,您看过 SmartfoxServer 吗?它拥有您想要的一切,并具有本机 Flash 客户端库。我在一个项目中使用它来管理数十万个连接的用户。
其他提示
尤里,
RabbitMQ、Haxe 和 as3: http://geekrelief.wordpress.com/2008/12/15/hxamqp-amqp-with-haxe/
RabbitMQ、Ruby 和 ACL: http://pastie.org/pastes/368315
您可能还想考虑使用 Nanite 和 RabbitMQ 来管理后端组: http://brainspl.at/articles/2008/10/11/merbcamp-keynote-and-introducing-nanite
你说你需要:
* broadcast messages by any client (1:N, N:N)
* (potentially) direct messages (1:1)
您可以使用 RabbitMQ 轻松完成这两件事。RabbitMQ 支持两种情况,即 1:N pubsub 和 1:1 消息传递,以及“直接”交换。
直接交换模式如下:
任何发布者(组成员)都会使用“路由密钥”(例如“yurii”)向代理发送消息。RabbitMQ 将此密钥与路由表(也称为“交换”)中的订阅绑定相匹配。每个绑定代表队列的订阅,表达对具有给定路由键的消息的兴趣。当路由和绑定键匹配时,消息将被路由到队列以供客户端(组成员)后续使用。这适用于 1:N 和 1:1 情况;N:N 建立在 1:N 之上。
路由模型简介: http://blogs.digitar.com/jjww/2009/01/rabbits-and-warrens/
总体介绍: http://google-ukdev.blogspot.com/2008/09/rabbitmq-tech-talk-at-google-london.html
您还需要:
* (important) authenticate/authorize clients with my own backend (say, through some kind of HTTP API)
请参阅 ACL 代码(上面的链接)。RabbitMQ 还有一个 HTTP 接口,但我们尚未将 HTTP 前端与 ACL 代码结合起来。但这不应该阻止奥尤。请访问rabbitmq-discuss列表,那里最近讨论了这个话题。
您还需要:
* create groups (by some backend process)
* to be able to kick specific clients by backend process (or server plugin)
我建议看看 Nanite 和 Workling 等工具是如何做到这一点的。组创建通常不是消息传递系统的一部分,相反,在 RabbitMQ 中,您可以使用订阅创建路由模式。您可以通过使用客户端用于将其消费队列绑定到交换器的密钥向其发送消息来踢出特定客户端。
希望这可以帮助!
亚历克西斯
我们一直在使用ActiveMQ。我们的 HR 系统供应商正在使用 Ruby/ActiveMQ 来广播和接收更新。
支持 Stomp 协议的其他开源消息代理有 OpenMQ,它包含在 GlassFish V3 和 GlassFish 2.1.1 中,但也可以独立工作,很快就会出现 JBoss 消息代理 HornetQ V2.1。OpenMQ 支持临时队列,这对于 RPC 风格的通信很有用,但 ActiveMQ 在 Stomp 适配器中也提供了一些有趣的功能。