二、RabbitMQ简介及AMQP协议

RabbitMQ简介

RabbitMQ是开源的消息代理和队列服务器,是由Erlang语言开发的,基于AMQP协议(Advanced Message Queuing Protocol高级消息队列协议)的标准实现。具有良好的性能和时效性,同时还能够非常好的支持集群和负载部署,非常适合在较大规模的分布式系统中使用。

为什么使用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. 集群模式丰富,表达式配置,HA模式,镜像队列模型,集群扩展很容易,并且可以通过增加节点实现成倍的性能提升;
    5. WEB管理和监控, WEB管理为后期运维提供很大的便利。

RabbitMQ劣势:

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

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

AMQP协议

AMQP(Advanced Message Queue):高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制,可以与不同产品、不同语言之间进行消息交互。

AMQP的基本概念

RabbitMQ是AMQP协议的一个开源实现,其内部实际上也是AMQP的基本概念。AMQP的模型架构和RabbitMQ的模型架构是一样的,生产者将消息发送给交换器,交换器和队列绑定。当生产者发送消息时所携带的RoutingKey与绑定时的BindingKey相匹配时,消息即被存入相应的队列之中。消费者可以订阅相应的队列来获取消息。

相关名词概念


  • Publisher
    也称Producer,消息生产者,数据的发送方。消息生产者连接RabbitMQ服务器然后将消息投递到Exchange。

  • Consumer
    消息消费者,数据的接收方。消息消费者订阅队列,RabbitMQ将Queue中的消息发送到消息消费者。
  • Server
    又称为Broker。接收客户端连接,实现AMQP的服务器实体。维护一条从Producer到Consumer的路线,保证数据能够按照指定的方式进行传输。但是这个保证也不是100%的保证,对于普通的应用已经足够了。当然对于商业系统来说,可以再做一层数据一致性的guard,就可以彻底保证系统的一致性了。
  • Connection
    连接,Producer和Consumer都是通过TCP连接到RabbitMQ Server的。程序的起始处就是建立这个TCP连接。Connection可以创建多个Channel,但不能线程间共享。某些情况下可以并发运行,但多线程共享是非线程安全的。
  • Channel
    信道。建立在上述的TCP连接中,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表一个会话任务。
  • Exchange
    交换机。接收消息,根据路由键转发消息到绑定的队列。Exchange将消息路由到一个或多个Queue中(或者丢弃)。Exchange并不存储消息。RabbitMQ中的Exchange有fanout、direct、topic、headers四种类型
  • Binding
    Exchange和Queue之间的虚拟连接,作用是把Exchange和Queue按照路由规则绑定起来。
  • RoutingKey
    生产者在将消息发送给Exchange的时候,一般会指定一个RoutingKey,Exchange根据这个关键字进行消息投递给Queue。这个RoutingKey需要与Exchange Type及Binding的RoutingKey联合使用才能最终生效。
  • Queue
    也称为Message Queue,消息队列,保存消息并将它们转发给消费者。多个消费者可以订阅同一个Queue,会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理
  • Virtual Host
    其实是一个虚拟概念。类似于权限控制组,一个Virtual Host里面可以有若干个Exchange和Queue,可以用来隔离Exchange和Queue。,同一个Virtual Host里面不能有相同名称的Exchange和Queue。默认为"/"

上一篇:RabbitMQ与AMQP协议详解


下一篇:rabbitMQ之AMQP协议