赞
踩
MQ,中文是消息队列(MessageQueue),字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。
RabbitMQ采用 AMQP 高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦。
RabbitMQ | ActiveMQ | RocketMQ | Kafka | |
---|---|---|---|---|
公司/社区 | Rabbit | Apache | 阿里 | Apache |
开发语言 | Erlang | Java | Java | Scala&Java |
协议支持 | AMQP,XMPP,SMTP,STOMP | OpenWire,STOMP,REST,XMPP,AMQP | 自定义协议 | 自定义协议 |
可用性 | 高 | 一般 | 高 | 高 |
单机吞吐量 | 一般 | 差 | 高 | 非常高 |
消息延迟 | 微秒级 | 毫秒级 | 毫秒级 | 毫秒以内 |
消息可靠性 | 高 | 一般 | 高 | 一般 |
可靠性
RabbitMQ使用一些机制来保证可靠性, 如持久化、传输确认及发布确认等
灵活的路由
在消息进入队列之前,通过交换器来路由消息。对于典型的路由功能, RabbitMQ 己经提供了一些内置的交换器来实现。针对更复杂的路由功能,可以将多个 交换器绑定在一起, 也可以通过插件机制来实现自己的交换器
扩展性
多个RabbitMQ节点可以组成一个集群,也可以根据实际业务情况动态地扩展集群中节点
高可用性
队列可以在集群中的机器上设置镜像,使得在部分节点出现问题的情况下队列仍然可用
多种协议
RabbitMQ除了原生支持AMQP协议,还支持STOMP, MQTT等多种消息中间件协议
多语言客户端
RabbitMQ 几乎支持所有常用语言,比如 Java、 Python、 Ruby、 PHP、 C#、 JavaScript 等
管理界面
RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息、集群中的节点等
支持跟踪机制
如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么
是具有现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。总而言之,是一个进程间传递异步消息的网络协议。
Module Layer
协议最高层,主要定义了一些客户端调用的命令,客户端可以用这些命令实现自己的业务逻辑
Session Layer
中间层,主要负责客户端命令发送给服务器,再将服务端应答返回客户端,提供可靠性同步机制和错误处理
Transport Layer
最底层,主要传输二进制数据流,提供帧的处理、信道服用、错误检测和数据表示等
生产者
消息生产者,就是投递消息的一方
消息一般包含两个部分:消息体(payload)和标签(Label)
消费者
**.**
分割当一个队列中的消息满足下列情况之一时,可以成为死信(dead letter):
如果这个包含死信的队列配置了dead-letter-exchange属性,指定了一个交换机,那么队列中的死信就会投递到这个交换机中,而这个交换机称为死信交换机(Dead Letter Exchange,检查DLX)。
如图,一个消息被消费者拒绝了,变成了死信:
因为simple.queue绑定了死信交换机 dl.direct,因此死信会投递给这个交换机:
如果这个死信交换机也绑定了一个队列,则消息最终会进入这个存放死信的队列:
另外,队列将死信投递给死信交换机时,必须知道两个信息:
这样才能确保投递的消息能到达死信交换机,并且正确的路由到死信队列。
利用TTL结合死信交换机,我们实现了消息发出后,消费者延迟收到消息的效果。这种消息模式就称为延迟队列(Delay Queue)模式。
当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列存储消息达到上限。之后发送的消息就会成为死信,可能会被丢弃,这就是消息堆积问题。
从RabbitMQ的3.6.0版本开始,就增加了Lazy Queues的概念,也就是惰性队列。惰性队列的特征如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。