消息队列之RabbitMQ

Posted zenghi-home

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息队列之RabbitMQ相关的知识,希望对你有一定的参考价值。

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

  1. 安装部署简单,上手门槛低,功能丰富,符合AMQP标准;
  2. 企业级消息队列,经过大量实践考验的高可靠;
  3. 集群易扩展,可以轻松的增减集群节点;
  4. 有强大的WEB管理页面。

RabbitMQ作为消息队列系统优势:

http://www.doc88.com/p-5826232080382.html 中对于RabbitMQ评价有两个维度:十万米高空看RabbitMQ和显微镜看RabbitMQ

  • 十万米高空看RabbitMQ
    1. 有商业化的运营,不会轻易死掉;
    2. 遵循AMQP协议,不会被绑架;
    3. 强大的社区支持,为技术进步提供动力;
    4. 大量成功的应用案例,例如阿里、网易等互联网巨头都有使用。
  • 显微镜看RabbitMQ
    1. Erlang开发,AMQP的标准实现,在支持持久化的消息队列中性能算很优秀的;
    2. 支持消息持久化、支持消息确认机制、灵活的任务分发机制等,支持功能非常丰富;
    3. 可靠性高;
    4. 集群扩展很容易,并且可以通过增加节点实现成倍的性能提升;
    5. WEB管理和监控,有些技术癌更喜欢命令行界面,但WEB管理为后期运维提供很大的便利。

RabbitMQ劣势:

性能比kafka和zero面前性能差(持久化消息和ACK确认的情况下生产和消费消息单机大约在1-2万左右)

结论:如果希望使用一个可靠性高、功能强大、易于管理的消息队列系统那么就选择RabbitMQ,如果想用一个性能高,但偶尔丢点数据不是很在乎可以使用kafka或者zeroMQ。

RabbitMQ的特点有如下几点:

  1. 可靠性(Reliability)

    RabbitMQ使用一些机制来保证可靠性,如持久化、传输确认及发布确认等。

  2. 灵活的路由(Flexible Routing)

    在消息进入队列前,通过交换机来路由消息。对于典型的路由功能,RabbitMQ已经提供了一些内置的交换器来实现。针对更复杂的路由功能,可以将多个交换器绑定在一起,也可以通过插件机制来实现自己的交换器。

  3. 消息集群(Clustering)

    多个RabbitMQ节点可以组成一个集群,也可以根据实际业务情况动态地扩展集群中节点。

  4. 高可用性(Highly Available Queues)

    队列可以在集群中的机器上设置镜像,使得部分节点出现问题的情况下队列仍然可用。

  5. 多种协议(Multi-protocol)

    RabbitMQ除了原生支持AMQP协议,还支持STOMP、MQTT等多种消息中间件协议。

  6. 多语言客户端(Many Clients)

    RabbitMQ几乎支持所有常用语言,比如Java、Python、Ruby、php、C#、javascript等。

  7. 管理界面(Management UI)

    RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息、集群中的节点等。

  8. 跟踪机制(Tracing)

    如果消息异常,RabbitMQ提供了消息跟踪机制,使用者可以找出发生了什么。

  9. 插件机制(Plugin System)

    RabbitMQ提供了许多插件,以实现从多方面进行扩展,当然也可以编写自己的插件。


以上是关于消息队列之RabbitMQ的主要内容,如果未能解决你的问题,请参考以下文章

微服务专题之.Net6下集成消息队列-RabbitMQ交换机模式代码演示(全)

rabbitmq - 不会获取队列中的所有消息

【rabbitMQ】消息队列之 rabbitMQ

快速入门分布式消息队列之 RabbitMQ(下)

消息队列之RabbitMQ

消息队列之 RabbitMQ