java - 用于客户端通知的 AMQP 或 XMPP

标签 java javascript c# xmpp amqp

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

该替代品不仅会被 Web 应用程序使用(通过 Web 套接字而不是 Flash),还会被用 C# 编写的其他桌面客户端应用程序使用。

我的要求是:

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

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

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

最佳答案

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

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

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

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

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

所以我建议选择 RabbitMQ 和 AMQP,我相信这是一个非常适合您需求的协议(protocol),但话虽如此,xmpp 也可能可以很好地完成这项工作。

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

PS:我觉得我应该诚实地说,我不太确定双向消息交换意味着什么,但如果这意味着发送和接收消息,那么您就很清楚了点也与AMQP。 :)

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

编辑

RabbitMQ 有一个名为虚拟主机的东西,它的作用类似于 RabbitMQ 自己的实例,因此您不必只是为了处理单独的职责而从设置集群开始。根据您设置队列和交换的方式,我没有看到客户端连接到 RabbitMQ 服务器的问题,但集群无疑是一个好主意。使用 HAProxy 设置 RabbitMQ 似乎也非常简单,但这又是我没有经验的事情。

关于java - 用于客户端通知的 AMQP 或 XMPP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14325515/

相关文章:

c# - Web Api 将列表作为 URL 参数传递的问题

c# - 无法使用 oData 查询选项

java - 等待静态初始化程序

javascript - 如何将Struts2属性设置为JavaScript函数的参数?

javascript - 当选择组中的单选按钮时 jQuery addClass

javascript - 可以为开发环境禁用 Kentico 的脚本和 css 缩小吗?

c# - Windows Phone 7 上的 HttpWebRequest

java - LibGDX 阶段褪色为黑色

java - 在 Iterator 中调用 next() 两次会抛出 NoSuchElementException

javascript - React中子组件更新时如何更新父组件