1.1、什么是消息队列
消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串、JSON等,也可以很复杂,比如内嵌对象。
消息队列(Message Queue,简称为MQ)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。
消息队列适用于需要可靠的数据传送的分布式环境。采用消息中间件的系统中,不同的对象之间通过传递信息来激活对方的事件,以完成相应的操作。发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接收者。
特性:
- 松耦合
消息队列提供了以松散耦合的灵活方式集成应用程序的一种机制。它们提供了基于存储和转发的应用程序之间的异步数据发送,即应用程序彼此不直接通信,而是与作为中介的消息中间件通信。
- 冗余(存储)
有些情况下,处理数据的过程会失败。消息中间件可以把数据持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。在把一个消息从消息中间件中删除之前,需要你的处理系统明确的指出该消息已经被处理完成,从而确保你的数据被完全第保存直到你使用完毕。
- 扩展性
因为消息中间件解耦了应用的处理过程,所以提高消息入队和处理的效率是很容易的,只要另外增加处理过程即可,不需要改变代码,也不需要调节参数。
- 削峰
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果以能处理这类峰值为标准而投入资源,无疑是巨大的浪费。使用消息中间件能够使关键组件支撑突发访问压力,不会因为突发的超负荷请求而完全崩溃。
- 可恢复性
当系统一部分组件失效时,不会影响到整个系统。消息中间件降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入消息中间件中的消息仍然可以在系统恢复后进行处理。
- 顺序保证
在大多数使用场景下,数据处理的顺序很重要,大部分消息中间件支持一定程序上的顺序性。
- 缓冲
在任何重要的系统中,都会存在需要不同处理时间的元素。消息中间件通过一个缓冲层来帮助任务最高效率地执行,写入消息中间件的处理会尽可能快速。该缓冲层有助于控制和优化数据流经过系统的速度。
- 异步通信
在很多时候应用不想也不需要立即处理消息。消息中间件提供了异步处理机制,允许应用把一些消息放入消息中间件中,但并不立即处理它,在之后需要的时候再慢慢处理。
为什么使用消息队列:
如最常见订单系统,用户点击下单后,需要发短信通知、返代金劵等,如果业务过大,需要提升性能,可以把发短信、返代金劵等不需要立即执行的操作拆分处理进行异步执行。这时可以用MQ
消息队列,在下单完成后,主程序发送一条消息到MQ后
结束,由另外的线程拉取MQ
(或由MQ
推送)消息,当发现由相关信息后,执行发短信、返代金劵操作。减轻了主程序的压力。
以上是用于业务解耦的情况,其他常见场景包括一致性、广播、削峰等。
1.2、消息模型
所有 MQ 产品从模型抽象上来说都是一样的过程:
消费者(consumer)订阅某个队列。生产者(producer)创建消息,然后发布到队列(queue)中,最后将消息发送到监听的消费者。
1.3、RabbitMQ
RabbitMQ是流行的开源消息队列系统,是由Erlang语言开发的AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现。具有良好的性能和时效性,同时还能够非常好的支持集群和负载部署,非常适合在较大规模的分布式系统中使用。
AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制,可以与不同产品、不同语言之间进行消息交互。
为什么使用RabbitMQ
:
- 安装部署简单,上手门槛低,功能丰富,符合AMQP标准;
- 企业级消息队列,经过大量实践考验的高可靠;
- 集群易扩展,可以轻松的增减集群节点;
- 有强大的WEB管理页面。
RabbitMQ作为消息队列系统优势:
从http://www.doc88.com/p-5826232080382.html 中对于RabbitMQ
评价有两个维度:十万米高空看RabbitMQ
和显微镜看RabbitMQ
:
- 十万米高空看
RabbitMQ
:- 有商业化的运营,不会轻易死掉;
- 遵循AMQP协议,不会被绑架;
- 强大的社区支持,为技术进步提供动力;
- 大量成功的应用案例,例如阿里、网易等互联网巨头都有使用。
- 显微镜看
RabbitMQ
:- Erlang开发,AMQP的标准实现,在支持持久化的消息队列中性能算很优秀的;
- 支持消息持久化、支持消息确认机制、灵活的任务分发机制等,支持功能非常丰富;
- 可靠性高;
- 集群扩展很容易,并且可以通过增加节点实现成倍的性能提升;
- WEB管理和监控,有些技术癌更喜欢命令行界面,但WEB管理为后期运维提供很大的便利。
RabbitMQ劣势:
性能比kafka和zero面前性能差(持久化消息和ACK确认的情况下生产和消费消息单机大约在1-2万左右)
结论:如果希望使用一个可靠性高、功能强大、易于管理的消息队列系统那么就选择RabbitMQ,如果想用一个性能高,但偶尔丢点数据不是很在乎可以使用kafka或者zeroMQ。
RabbitMQ的特点有如下几点:
- 可靠性(Reliability)
RabbitMQ使用一些机制来保证可靠性,如持久化、传输确认及发布确认等。
- 灵活的路由(Flexible Routing)
在消息进入队列前,通过交换机来路由消息。对于典型的路由功能,RabbitMQ已经提供了一些内置的交换器来实现。针对更复杂的路由功能,可以将多个交换器绑定在一起,也可以通过插件机制来实现自己的交换器。
- 消息集群(Clustering)
多个RabbitMQ节点可以组成一个集群,也可以根据实际业务情况动态地扩展集群中节点。
- 高可用性(Highly Available Queues)
队列可以在集群中的机器上设置镜像,使得部分节点出现问题的情况下队列仍然可用。
- 多种协议(Multi-protocol)
RabbitMQ除了原生支持AMQP协议,还支持STOMP、MQTT等多种消息中间件协议。
- 多语言客户端(Many Clients)
RabbitMQ几乎支持所有常用语言,比如Java、Python、Ruby、PHP、C#、JavaScript等。
- 管理界面(Management UI)
RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息、集群中的节点等。
- 跟踪机制(Tracing)
如果消息异常,
RabbitMQ
提供了消息跟踪机制,使用者可以找出发生了什么。 - 插件机制(Plugin System)
RabbitMQ提供了许多插件,以实现从多方面进行扩展,当然也可以编写自己的插件。
原文地址:https://www.cnblogs.com/zenghi-home/p/9958771.html