【问题标题】:AMQP or XMPP for Client Notifications用于客户端通知的 AMQP 或 XMPP
【发布时间】:2012-12-28 19:55:34
【问题描述】:

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

不仅网络应用程序(通过网络套接字而不是 Flash)使用该替换,而且用 C# 编写的其他桌面客户端应用程序也将使用该替换。

我的要求是:

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

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

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

【问题讨论】:

  • 如果您仍在使用 Java,那么 J2EE JMS 可能是一个选项或 SonicMQ。

标签: java javascript c# xmpp amqp


【解决方案1】:

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

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

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

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

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

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

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

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

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

编辑

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

【讨论】:

  • 感谢您的回答。那么让 RabbitMQ 对我们的应用程序数据库进行用户身份验证有多容易?想要这样做甚至是一个合理的想法还是我应该研究其他设置身份验证的模式?
  • 好吧,我一定是误会了你,认证是针对想要访问 Rabbit 的应用程序。 RabbitMQ 做的,就是发送消息,而且它非常擅长发送消息。因此,在这种情况下,您将向应用程序发送一条消息,该应用程序根据消息中的信息依次查询数据库。
  • 我想这是可能的。
  • 我不同意你对 XMPP 的一些看法。例如,您说 pubsub 不是协议的一部分,它是一个扩展。 XMPP 实际上就是为此目的而设计的,因为 X 实际上代表 eXtensible。该协议由基本消息交换的规范以及用于解决消息传递的特定功能用例的各种规范组成。 Pubsub 将是其中之一,例如多用户聊天是另一个。您暗示它们基本上是事后的想法,实际上并不属于协议,但事实并非如此。
  • @Robin 毫无疑问,xmpp 被设计为可扩展的,我在回答的第一句话中就说明了这一点。但不可否认的是,pub/sub 是一种扩展,而不是核心协议的一部分。我声明我和其他一些人认为这是不利的事实,这意味着其他人(也许是你?)不这样做。我还在第二段中指出,许多协议扩展无疑具有很高的质量,所以我不太理解你的批评。除非是因为第一段最后两个句子的顺序,否则为什么不建议编辑?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 2014-02-11
  • 2011-03-11
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多