比较三种最多见和最流行的基于TCP/IP的消息传递协议,并提供每种优点的快速总结:AMQP、MQTT和STOMP,RabbitMQ 3.0版本中支持全部这三个协议-咱们将使用这些协议做为示例并稍后再回来。git
AMQP-高级消息队列协议,旨在做为现有专有消息传递中间件的开放替代品。使用AMQP的两个最重要的缘由是可靠性和互操做性。顾名思义,它提供了与消息传递相关的各类功能,包括可靠的排队,基于主题的发布和订阅消息传递,灵活的路由,事务和安全性。AMQP直接以扇出形式,按主题和基于标题交换路由消息。web
如此丰富的功能集能够实现许多细粒度控制。您能够限制对队列的访问,管理其深度等。消息属性,注释和标题等功能使其很是适合各类企业应用程序。该协议旨在提升许多大型公司的可靠性,这些公司依靠消息传递来集成应用程序并在其组织中移动数据。在RabbitMQ的状况下,有许多不一样的语言实现和可用的大样本,使其成为构建大规模,可靠,弹性或群集消息传递基础结构的良好选择。数据库
AMQP是一种二进制有线协议,旨在实现不一样供应商之间的互操做性。在其余协议失败的状况下,AMQP的采用率很高。摩根大通等公司天天使用它来处理10亿条消息。NASA将其用于星云云计算。Google将其用于复杂的事件处理。如下是一些其余AMQP示例和连接:编程
MQTT(消息队列遥测传输)最初有IBM普及计算团队的开发的,它们与工业领域的合做伙伴共同开发。在过去的几年中,该协议已经转移到开源社区,随着移动应用程序的开始,其受欢迎程度显着增长,而且正在进入标准组的手中设计模式
MQTT的合集原则和目标比AMQP更简单,,更集中-它提供了发布和订阅消息(没有队列),专门针对资源受限的设备和低带宽、高延迟网络,例如拨号线路和卫星链路。基本上,它能够在嵌入式是系统中有效使用。浏览器
MQTT对功能更强大的“企业消息传递”代理商的优点之一是其故意低占用空间使其成为当今移动和开发“ 物联网 ”风格应用程序的理想选择。事实上,像Facebook这样的公司正在将它做为移动应用程序的一部分,由于它具备如此低的功耗,而且网络带宽很小。缓存
一些基于MQTT的代理支持数千个并发设备链接。它提供三种服务质量:1)火灾和遗忘/不可靠,2)“至少一次”以确保它至少发送一次(但可能被发送超过一次),以及3)“确切地说一旦”。安全
MQTT的优势是简单(只有五种API方法),一个紧凑的二进制数据包有效负载(没有消息属性,压缩标头,比基于文本的HTTP更简洁),它很是适合简单的推送消息传递方案,如温度更新,股票价格代码,油压供应或移动通知。它对于将机器链接在一块儿很是有用,例如使用MQTT将Arduino设备链接到Web服务。服务器
STOMP(简单/流式文本导向消息传递协议)是这三种协议中惟一一种基于文本的协议,使其在覆盖范围方面更相似与HTTP。与AMQP同样,STOMP提供带有属性的消息(或帧)标头或帧体。这里的设计原则是建立一些简单且可普遍互操做的东西。例如,可使用想telnet客户端这样简单的东西链接到STOMP代理。websocket
可是,STOMP不处理队列和主题。它使用带有“目标”字符串的SEND语义。代理必须映射到内容理解的内容,例如主题,队列或交换。消费者而后订阅这些目的地。因为规范中没有强制要求这些目的地,所以,不一样的经济人可能会支持不一样的目的地风格。所以,在代理之间移植代码并不老是直截了当的。
可是,STOMP简单而轻便(尽管在线上优势冗长),具备管饭的语言绑定。它还提供了一些事务语义。其中一个最有趣的例子是RabbitMQ Web Stomp,它容许您经过websockets在浏览器中公开消息。这开辟了一些有趣的可能性 - 好比使用全部类型的信息实时更新浏览器,移动应用程序或机器。
什么是消息队列?
消息队列是一种异步的服务间通讯方式,使用与无服务和微服务架构。消息在被处理和删除以前一直存储在队列上。每条消息仅可被一直为用户处理一次。消息队列可被用于分离重量级处理、缓存或批处理工做以及缓解高峰期工做负载。
在现代云架构中,应用程序被分解为多个规模较小且更易于开发、部署和维护的独立构建模块。消息队列可为这些分布式应用程序提供通讯和协调。消息队列能够显著简化分离应用程序的编码,同时提升性能、可靠性和可扩展性。
借助消息队列,系统的不一样部分可相互通讯并异步执行处理操做。消息队列提供一个临时存储消息的轻量级缓存区,以及容许软件组件链接到队列以发送接受消息的的终端节点。这些消息一般较小,能够是请求、恢复、错误消息或明文消息等。要发送消息时,一个名为“建立器”的组件将消息添加到队列。消息将存储在队列中,直至名为“处理器”的另外一组件检索该消息并执行相关操做。
许多建立器和处理器均可以使用队列,但一条信息只能有一盒处理器处理一次。所以,这种消息收发模式一般称为一对一或点对点通讯。若是消息须要由多个处理器进行处理,可采用扇出设计模式将消息队列与发布/订阅消息收发结合起来。
ActiveMQ是由Apache出品,ActiveMQ是一个彻底支持JMS1.1和JMS1.4规范的JMS Provider实现。它很是快速,只是多种语言的客户端和协议,并且能够很是容易的嵌入到企业的应用环境中,并有许多高级功能。
ActiveMQ 能够运行在 Java 语言所支持的平台之上。使用 ActiveMQ 须要:
RabbitMQ 于 2007 年发布,是一个在 AMQP (高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。
RabbitMQ 能够运行在 Erlang 语言所支持的平台之上,包括 Solaris,BSD,Linux,MacOSX,TRU64,Windows 等。使用 RabbitMQ 须要:
RocketMQ出自阿里的开源产品,用Java语言实现,在设计时参考了Kafka,并作出了本身的一些改进,消息可靠性上比Kafka更好。RocketMQ在阿里内部被普遍应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景。
RocketMQ能够运行在Java语言所支持的平台之上。使用RocketMQ须要:
Apache Kafka 是一个 分布式消息发布订阅 系统。它最初由 LinkedIn 公司基于独特的设计实现为一个 分布式的日志提交系统 (a distributed commit log),以后成为 Apache 项目的一部分。Kafka 性能高效、可扩展良好 而且 可持久化。它的 分区特性,可复制 和 可容错 都是其不错的特性。
使用 Kafka 须要:
发布/订阅消息收发是一种异步的服务间通讯方式,适用于无服务和微服务架构。在发布/订阅模式下,发布到主题的任何的任何消息都会当即被主题的全部订阅者接受。发布/订阅消息收发可用于启用事件驱动架构,或分离应用程序,以提升性能、可靠性和可扩展性。
发布/订阅消息收发基础知识
在现代云架构中,应用程序被分解为多个规模较小且易于开发、部署和维护的独立构建块。发布/订阅消息收发能够为这些分布式应用程序提供及时事件通知。
发布/订阅模式让消息可以异步广播到系统中的不一样部分。消息主题与消息队列相似,能够提供一个轻量型机制来广播异步事件通知,还能够提供能让软件组件链接主题以便发送和接受消息的终端节点。在广播消息时,一个叫作“发布者”的组件会将消息推送到主题。与在消息被检索前批量处理消息的消息队列不一样的是,消息主题无需或使用极少消息队列便可传输消息,并将消息当即推送给全部订阅者。订阅该主题的全部组件都会收到广播的每一条消息,除非订阅着设置了消息筛选策略。
消息主题的订阅着一般执行不一样的功能,并能够同时对消息执行不一样的操做。发布者无需知道谁在使用广播的消息而订阅着也无需知道消息来自哪里。这种消息收发模式与消息队列稍有不一样,在消息队列中,发送消息的组件一般知道发送目的地。
绝不奇怪,考虑到基本消息传递对数据驱动的应用程序的影响,有许多技术支持某种形式的消息队列,发布 - 订阅消息传递或二者兼而有之。
技术,如Apache的ActiveMQ的,亚马逊SQS,IBM的WebSphere MQ,RabbitMQ的,和RocketMQ最初设计主要是为消息排队的用例。Apache Kafka和Google Cloud Pub / Sub等其余技术主要用于支持发布 - 订阅用例。其余一般较新的解决方案,如 Apache Pulsar, 支持 消息队列和pub-sub消息传递。
RabbitMQ、Kafka和ActiveMQ都是用于提供异步通讯和解耦进程(分离消息的发送者和接受者)的消息传递技术。它们被称为消息队列,消息代理或消息传递工具。RabbitMQ、Kafka和ActiveMQ都具备相同的基本用途。但能够以不一样的方式完成工做。Kafka始终高吞吐量的分布式消息传递系统。RabbitMQ是基于AMQP的可靠消息代理。ActiveMQ和Kafka都是Apache产品,都是用Java编写的;RabbitMQ是用Erlang编写的。
Kafka在于分布式架构,RabbitMQ基于AMQP协议来实现,RocketMQ的思路来源于Kafka,改为了主从结构,在事务性和可靠性方面作成了优化。普遍来讲,电商、金融等对事务一致性要求很高的,能够考虑RabbitMQ和RocketMQ,对性能要求高的可考虑Kafka。