0

我正在设计一个自定义消息系统的替代品,该系统目前用于通知 JavaScript Web 应用程序有关来自服务器端 (Java) 的更改内容。这个遗留的消息系统通过使用基于文本的自定义协议和纯 Java 套接字通过 Flash XMLSocket 工作。

替换将不仅由 Web 应用程序(通过 Web 套接字而不是 Flash)使用,而且由用 C# 编写的附加桌面客户端应用程序使用。

我的要求是:

  • 用户认证
  • 传输加密 (SSL/TLS)
  • 双向消息交换
  • 某种(自动)发布/订阅,以便用户只获得他们被允许接收的消息
  • 基于既定协议的消息交换(以便我们可以在可能的情况下使用现有库)
  • 可集群的服务器组件

此时消息系统将仅用于向客户端发布更新。客户端将对这些消息做出反应并直接从服务器获取更多信息(而不是通过消息传递系统)。如果这个新的消息传递系统成功建立,它可能会在未来用于更高级的用例。一些可能性可能包括用户聊天、文件交换和服务器组件的远程控制。

我对实现这些要求的可行技术做了一些研究,我认为我的选择归结为使用ejabberd (XMPP) 或RabbitMQ (AMQP)。关于我的要求,这两个系统的主要优点和缺点是什么?我们已经将 RabbitMQ 用于系统基础设施的其他部分,所以这是我的自然选择。我只是不确定让客户端应用程序直接连接到这样一个关键的主要组件是否是个好主意。这可以通过只为客户端通知使用不同的 RabbitMQ 安装来缓解。

4

1 回答 1

2

好吧,您可以使用这两种协议来满足您的需求,xmpp 是一种可扩展的协议,因此毫无疑问,您正在寻找的东西确实已经作为plugin协议的正确术语存在。然而,包括我在内的一些人实际上可能认为这是一个缺点,它们给协议增加了额外的复杂性。要记住的另一件事是 xmpp 主要设计为即时消息传递协议。例如,发布/订阅是 xmpp 的扩展,而不是协议本身的一部分。

话虽如此,xmpp 得到了 Google 等组织的支持,这意味着有一些主要参与者在使用该协议,因此毫无疑问,其中一些扩展非常好,并且编写/经过深思熟虑。

另一方面,您拥有 AMQP,这是一种几乎专为您所追求的协议而设计的协议。它得到了 JP Morgan、Cisco、Credit Suisse 等组织的支持,因此毫无疑问,AMQP 是一个值得信赖的协议,尽管它的早期版本已受到批评

在使用 RabbitMQ 时,内存似乎存在一些问题,但是我不能说太多,因为我只是收到有关此问题的通知,并且从未真正真正修复它甚至理解它。然而,似乎有不少人在不同版本的 RMQ 上遇到过这种情况。

但对我来说,RabbitMQ 从来没有崩溃过(嘿,如果 erlang 以一件事而闻名,那就是稳定性),设置起来很有趣,而且在集群中设置真的很容易,而且你可以轻松地将队列镜像到多个实例上的 RMQ 并且您可以通过让一个或多个实例将消息写入磁盘来获得额外的安全层。

所以我会说使用 RabbitMQ 和 AMQP,我相信它是一个非常适合您需求的协议,但是已经说过 xmpp 可能也可以很好地完成工作。

我读过这本书,它很好地介绍了 AMQP 和 RabbitMQ,但我发现它在技术方面有所欠缺,它基本上是一个很好的教程。

PS:我觉得我应该说实话,我不太确定这bidirectional message exchange意味着什么,但如果这意味着发送和接收消息,那么你对 AMQP 也很清楚。:)

我希望这有助于阐明选择哪种协议。

编辑

RabbitMQ 有一个叫做 RabbitMQvirtual hosts的自己的实例,因此您不必为了处理单独的职责而开始设置集群。根据您设置队列和交换的方式,我认为客户端连接到 RabbitMQ 服务器没有问题,但集群无疑是个好主意。使用 HAProxy 设置 RabbitMQ 似乎也很容易,但这又是我没有经验的事情。

于 2013-01-14T21:44:25.250 回答