欢迎您, 来到 宁时修博客.^_^

消息队列--RabbitMQ(一) 原理和基本概念

2018/07/12 林木立 MQ 968
RabbitMQ 原理和基本概念

一、什么是MQ

        MQ全称为Message Queue(消息队列),消息队列是应用程序和应用程序之间的通信方法;消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。MQ将消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。


二、为什么要用MQ

        消息队列是一种应用间的异步协作机制,那什么时候需要使用消息队列呢?像用户下单之后、生成订单、结算,定时给系统注册用户推送活动消息,一些常见的流程类的业务都会用到消息队列服务。



三、RabbitMQ简介

        RabbitMQ是开源的,实现了AMQP协议的,采用Erlang(面向并发编程语言)编写的,可复用的企业级消息系统;Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的magic cookie来实现)。因此,RabbitMQ天然支持Clustering。

        AMQP(高级消息队列协议)是一个异步消息传递所使用应用层协议规范,为面向消息中间件设计,基于此协议的客户端与消息中间件可以无视消息来源传递消息,不受客户端、消息中间件、不同的开发语言环境等条件的限制。

        AMQP模型:

        20180713174434.png

        RabbitMQ是一个消息的代理器,用于接收和发送消息,你可以这样想,他就是一个邮局,当您把需要寄送的邮件投递到邮筒之时,你可以确定的是邮递员先生肯定会把邮件发送到需要接收邮件的人的手里,不会送错的。在这个比喻中,RabbitMQ就是一个邮箱,也可以理解为邮局和邮递员,他们负责把消息发送出去和用于接收信息。

        RabbitMQ和邮局这两者之间的主要区别是它不会处理纸质邮件,取而代之的是接收、存储和发送二进制数据块,也就是我们通常所说的消息。

        RabbitMQ模型:

20180713174538.png


        术语描述:

        1)Server(Broker):接收客户端连接,实现AMQP协议的消息队列和路由功能的进程。形象比喻:邮局。


        2)Publisher:生产者,即消息的生产者,向Exchange(交换器)发布消息的应用程序。


        3)Consumer:消费者,即接收生产者发来的消息的客户端应用。


        4)Message:消息,由消息头(Header)和消息体(Body)组成。Header是由生产者添加的各种属性的集合,包括:Message是否被持久化、优先级是多少、由哪个Message Queue接收等,简略概括:routing-key(路由键)、priority(优先级)、delivery-mode(持久存储)。消息体是不透明的,是真正需要发送的数据内容。Header就像信件,Body则是信纸。


        5)Virtual Host:虚拟主机的概念,类似权限控制组,一个Virtaul Host里面可以有若干个Exchange和Queue,当多个不同的用户使用同一个RabbitMQ Server提供的服务时,可划分出多个vhost,每个用户在自己的vhost中创建Exchange/Queue等。就像Tomcat中webapps路径下部署多个web项目。在RabbitMQ中权限控制的最小的都是Virtual Host。其实一个vhost可以看作一个RabbitMQ Server,它拥有自己的Queue、Exchange、绑定与权限机制。RabbitMQ默认的vhost是“/”。


        6)Exchange:交换器,接收生产者发送的消息,并根据Binding规则将消息路由给服务器中的Queue,如同邮递员。


        7)ExchangeType:交换器类型,决定了路由消息行为,RabbitMQ中有四种类型:fanout、direct、topic、headers。

            fanout:把所有发送到该Exchange的消息,路由到所有与它绑定的Queue中。

            direct:把消息路由到那些binding key与routing key完全匹配的Queue中。

            topic:与direct类似,只是匹配规则有些不同,模式匹配。

            headers:一个Message由headers和body组成,body代表消息实体,headers则代表了消息的各种属性。因此headers类型的Exchange是根据发送的消息内容中的headers属性进行匹配。


        8)Routing key:生产者在将消息发送给Exchange的时候,一般会指定一个routing key,来指定这个消息的路由规则,而这个routing key需要与Exchange Type及binding key联合使用才能最终生效。

        在Exchange Type与binding key固定的情况下(在正常使用时一般这些内容都是固定配置好的),我们的生产者就可以在发送消息给Exchange时,通过指定routing key来决定消息流向哪里。

        RabbitMQ为routing key设定的长度限制为255 bytes。


        9)Binding:将Exchange与Queue关联起来,RabbitMQ就知道如何正确地将消息路由到指定的Queue。


        10)Binding key:Exchange在与多个Message Queue发生Binding后会生成一张路由表,路由表中存储着Message Queue所需消息的限制条件即Binding Key。当Exchange收到Message时会解析其Header得到Routing Key,Exchange根据Routing Key与Exchange Type将Message路由到Message Queue。Binding Key由Consumer在Binding Exchange与Message Queue时指定,而Routing Key由Producer发送Message时指定,两者的匹配方式由Exchange Type决定,就好比于邮件上面的地址。


        11)Queue:也叫Message Queue,消息队列,用来保存还没被消费者消费的消息。好比邮箱。一个消息可以进入一个或多个队列,除非消费者来取走,否则它会一直在消息队列中。


        12)Connection:连接,对RabbitMQ来说,就是客户端和Broker之间的TCP连接


        13)Channel:信道,仅仅创建了客户端到Broker之间的连接后,客户端还是不能发送消息的。需要为每一个Connection创建Channel,AMQP协议规定只有通过Channel才能执行AMQP的命令。一个Connection可以包含多个Channel。之所以需要Channel,是因为TCP连接的建立和释放都是十分昂贵的,如果一个客户端每一个线程都需要与Broker交互,如果每一个线程都建立一个TCP连接,暂且不考虑TCP连接是否浪费,就算操作系统也无法承受每秒建立如此多的TCP连接,可以简单的理解为线程池中的一个个线程。信道是多路复用、独立的双向数据传输通道。无论是发布消息、订阅队列、接收消息都是通过信道来完成。复用信道是为了降低系统资源的消耗。


四、RabbitMQ特点 

        具体如下:

        1)可靠性(Reliability

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

        

        2)灵活的路由(Flexible Routing)

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

        

        3)消息集群(Clustering)

        多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker 。

        

        4)高可用(Highly Available Queues)

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

        

        5)多种协议(Multi-protocol)

        RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等。

        

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

        RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等。

        

        7)管理界面(Management UI)

        RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。

        

        8)跟踪机制(Tracing)

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

       

        9)插件机制(Plugin System)

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



五、RabbitMQ工作流程

    1)Client 连接到消息队列服务器,开启一个channel

    2)Client 声明一个exchange、queue,并配置相关属性

    3)Client 使用routing key,在exchange与queue之间建立好绑定关系

    4)Client 传递消息到exchange(交换器)

    5)Exchange 接收到消息后,根据预定的KEY与绑定关系,对消息进行路由至消息队列


未命名文件.png





点赞
说说你的看法

所有评论: (0)

# 加入组织

1、用手机QQ扫左侧二维码

2、搜Q群:1058582137

3、点击 宁时修博客交流群