美文网首页RabbitQM
RabbitMQ学习总结 第一篇:理论篇

RabbitMQ学习总结 第一篇:理论篇

作者: ChinaXieShuai | 来源:发表于2019-03-15 17:35 被阅读0次

    今天咱们来聊一聊消息队列(MQ),以RabbitMQ为例。

    1. 定义

    消息队列:在消息的传输过程中保存消息的的容器。

    这是一个较为经典的消费-生产者模型,说起来比较抽象,打个比方:A线程需要给B线程发送消息(A、B线程不一定是在同一台机器上的),A线程先把消息发送到消息队列服务器上,然后B线程去读取或是订阅消息服务器上消息队列中的消息,线程A和B之间并没有进行直接通信。MQ服务器在中间起到中继的作用。

    2. 适用的应用场景

    比较适合异步传输,这里解释一下什么是异步和同步。

    异步:发送方不关心消息有没有发送成功,只发送消息,不去获取消息是否发送成功。

    同步:发送方关心消息是否发送成功,发送消息后,会等待接收方返回状态码,根据状态码来判断是否发送成功,然后执行相对于的动作。

    下边以Http中的同步和异步为例:

    如:普通的B/S架构客户端和服务器端之间的通信就是同步的,即提交请求 ---> 等待服务器处理完毕返回消息 ---> 拿到服务器返回的消息,处理完毕。

    如:Ajax技术就是异步的,请求通过事件触发 ---> 服务器处理(浏览器不用等待,仍可以做其他的事情) ---> 处理完毕。

    有人可能会好奇说应用场景怎么说到了同步和异步,那说明你还不是很理解技术和应用场景之间的紧密联系。

    3. RabbitMQ

    在消息队列中有很多类似的产品,以后我会独立发一篇博文来经行说明。我们这里以RabbitMQ为例。

    RabbitMQ是AMQP(高级消息队列协议)的一个标准实现,关于它的快速入门,可以在这里查看:http://www.rabbitmq.com/getstarted.html

    3.1. 角色概念

    每个开源项目都有自己的设计方法以及模块角色,RabbitMQ也不例外。结构图如下:

    image.png

    Broker:即消息队列服务器实体

    Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。

    Queue:消息队列载体,每个消息都会被投入到一个或多个队列。

    Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。

    Routing Key:路由关键字,exchange根据这个关键字进行消息投递。

    vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。

    producer:消息生产者,就是投递消息的程序。

    consumer:消息消费者,就是接受消息的程序。

    channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

    3.2. 工作过程

    • 生产者客户端:
    1. 客户端连接到RabbitMQ服务器上,打开一个消息通道(channel);
    2. 客户端声明一个消息交换机(exchange),并设置相关属性。
    3. 客户端声明一个消息队列(queue),并设置相关属性。
    4. 客户端使用routing key在消息交换机(exchange)和消息队列(queue)中建立好绑定关系。
    5. 客户端投递消息都消息交换机(exchange)上
    6. 客户端关闭消息通道(channel)以及和服务器的连接。
    • 服务器端:

    exchange接收到消息后,根据消息的key(这个key的产生规则暂时没研究,有知道的小伙伴可以留言告诉我)和以及设置的binding,进行消息路由,将消息投递到一个或多个消息队列中。

    关于exchange也有几个类型:

    (1). Direct交换机:完全根据key进行投递。例如,绑定时设置了routing key为abc,客户端提交信息提交信息时只有设置了key为abc的才会投递到队列;

    (2).Topic交换机:在key进行模式匹配后进行投递。例如:符号”#”匹配一个或多个字符,符号””匹配一串连续的字母字符,例如”abc.#”可以匹配”abc.def.ghi”,而”abc.”只可以匹配”abc.def”。

    (3).Fanout交换机:它采取广播模式,消息进来时,将会被投递到与改交换机绑定的所有队列中。

    • 消费者客户端:

    (暂时未研究,后续更新)

    3.3. RabbitMQ的消息持久化

    RabbitMQ支持数据持久化,也就是把数据写在磁盘上,可以增加数据的安全性。消息队列持久化包括三个部分:

    1. 消息交换机(exchange)持久化,在声明时指定durable为1
    2. 消息队列(queue)持久化,在声明时指定durable为1
    3. 消息持久化,在投递时指定delivery_mode为2(1是非持久化)

    如果消息交换机(exchange)和消息队列(queue)都是持久化的话,那么他们之间的绑定(Binding)也是持久化的。如果消息交换机和消息队列之间一个持久化、一个非持久化,那么就不允许绑定。

    相关文章

      网友评论

        本文标题:RabbitMQ学习总结 第一篇:理论篇

        本文链接:https://www.haomeiwen.com/subject/eiermqtx.html