AMQP或XMPP用于客户端通知

时间:2013-01-14 19:47:43

标签: java javascript c# xmpp amqp

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

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

我的要求是:

  • 用户身份验证
  • 传输加密(SSL / TLS)
  • 双向消息交换
  • 某种(自动)发布/订阅,以便用户只获得允许接收的消息
  • 基于已建立的协议进行消息交换(以便我们可以尽可能使用现有的库)
  • 群集服务器组件

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

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

1 个答案:

答案 0 :(得分:2)

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

据说xmpp得到了谷歌等组织的支持,这意味着有一些主要的参与者使用这个协议,所以毫无疑问,有些扩展程序非常好,并且写得很好/想出来。

另一方面,你有AMQP,这是一个几乎专门为你所追求的设计的协议。它得到了摩根大通,思科,瑞士信贷等组织的支持。所以毫无疑问,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非常容易,但这又是我没有经验的东西。