客户端通知的AMQP或XMPP

本文关键字:XMPP AMQP 通知 客户端 | 更新日期: 2023-09-27 17:52:54

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

这个替换将不仅被web应用程序使用(通过web套接字而不是Flash),还将被一个用c#编写的额外桌面客户端应用程序使用。

我的要求是:

  • 用户身份验证
  • 传输加密(SSL/TLS)
  • 双向消息交换
  • 某种(自动)发布/订阅,以便用户只获得他们被允许接收的消息
  • 基于已建立的协议的消息交换(以便我们可以在可能的情况下使用现有的库)
  • 可集群服务器组件
此时,消息传递系统将仅用于向客户端发布更新。客户机将对这些消息作出反应,并直接从服务器(而不是通过消息传递系统)获取进一步的信息。如果成功地建立了这个新的消息传递系统,它将来可能会用于更高级的用例。一些可能性包括用户聊天、文件交换和远程控制服务器组件。

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

客户端通知的AMQP或XMPP

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

也就是说xmpp是由像Google这样的组织支持的,这意味着有一些主要的参与者使用这个协议,所以毫无疑问,一些扩展确实很好,写得很好/考虑得很周到。

另一方面,你有AMQP,一个几乎是专门为你所追求的设计的协议。它是由摩根大通、思科、瑞士信贷等组织支持的,所以毫无疑问AMQP是一个值得信赖的协议,尽管它的早期版本受到了批评。

当谈到使用RabbitMQ时,似乎有一些内存问题,但是我不能说太多,因为我只被通知了这个问题,从来没有真正进入实际修复它,甚至理解它。然而,似乎有相当多的人在不同版本的RMQ上遇到了这个问题。

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

所以我会说使用RabbitMQ和AMQP,我相信这是一个非常适合你需要的协议,但是已经说过xmpp可能也可以做得很好。

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

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

我希望这对选择哪种协议有所帮助。

编辑

RabbitMQ有一个叫做virtual hosts的东西,它就像RabbitMQ的一个自己的实例,所以你不必一开始就建立一个集群来处理单独的责任。这取决于你如何设置你的队列和交换,我不认为客户端连接到RabbitMQ服务器有什么问题,但集群无疑是一个好主意。似乎用HAProxy设置RabbitMQ也很容易,但这又是我没有经验的事情。