zoukankan      html  css  js  c++  java
  • 【MQ中间件】RabbitMQ -- RabbitMQ消息模式(2)

    RabbitMQ消息模式

    各个模式相关代码及笔记md已汇总至gitHub专区:

    RabbitMQStudy

    1.RabbitMQ架构

    1.1.RabbitMQ核心组成

    核心概念:
    Server:又称Broker ,接受客户端的连接,实现AMQP实体服务。 安装rabbitmq-server
    Connection:连接,应用程序与Broker的网络连接 TCP/IP/ 三次握手和四次挥手
    Channel:网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道,客户端可以建立对各Channel,每个Channel代表一个会话任务。
    Message :消息:服务与应用程序之间传送的数据,由Properties和body组成,Properties可是对消息进行修饰,比如消息的优先级,延迟等高级特性,Body则就是消息体的内容。
    Virtual Host 虚拟地址,用于进行逻辑隔离,最上层的消息路由,一个虚拟主机理由可以有若干个Exhange和Queueu,同一个虚拟主机里面不能有相同名字的Exchange
    Exchange:交换机,接受消息,根据路由键发送消息到绑定的队列。(==不具备消息存储的能力==)
    Bindings:Exchange和Queue之间的虚拟连接,binding中可以保护多个routing key.
    Routing key:是一个路由规则,虚拟机可以用它来确定如何路由一个特定消息。
    Queue:队列:也成为Message Queue,消息队列,保存消息并将它们转发给消费者。

    1.2.RabbitMQ整体架构

     从架构图中我们可以看出:RabbitMQ架构包含了:Provider(生产者)Exchanges(交换机)Queues(队列)Consumer(消费者)

    1.3.RabbitMQ的运行流程

    生产者将业务方数据进行可能的包装, 之后封装成消息, 发送( AMQP 协议里这个动作对应的命令为Basic.Publish) 到Broker 中。消费者订阅并接收消息(AMQP 协议里这个动作对应的命令为Basic.Consume 或者Basic. Get) ,经过可能的解包处理得到原始的数据,之后再进行业务处理逻辑。这个业务处理逻辑并不一定需要和接收消息的逻辑使用同一个线程。

    消费者进程可以使用一个线程去接收消息,存入到内存中,比如使用Java 中的BlockingQueue 。业务处理逻辑使用另一个线程从内存中读取数据,这样可以将应用进一步解稿,提高整个应用的处理效率。

    详细的执行流程过程涉及到的底层通信原理比较复杂,有兴趣的可以了解另一篇博文,写的非常详细,这里就不再做过多地阐述:

    rabbitMQ基本概念

    rabbitMQ运转流程

     

    2.RabbitMQ支持的消息模式

    参考官网:https://www.rabbitmq.com/getstarted.html

    2.1.简单模式 Simple

    在简单模式的消息发送中,不需要特别创建交换机(指定交换机的类型),通过默认的交换机Binding Default exchange,通过指定Routing key关联Queues中的queue name向对应的Queue队列发送消息。

    注意:

    rabbitmq发送消息一定有一个交换机,如果没有创建交换机,默认使用Default_exchange进行绑定。

     

    最终向queue1中发送消息,获取消息内容如下:

    Ack Mode:消息应答模式

    Nack message:接收消息后不对消息进行应答,及消费者不会回复反馈给生产者,Queue中仍然会保存消息;

    Ack message:接收消息并应答,此时生成者受到消费者回复,将Queue中该条消息消费。

    2.2.工作队列模式 WorkQueues

    工作队列模式也是指定的默认的default默认交换机对多个Queue消费者进行消息的发送,

    主要有两种模式:
    1、轮询模式分发:一个消费者一条,按均分配,平均分,不会因为哪个消费者内部处理速率较快而减少消息的发送;
    2、公平分发:根据消费者的消费能力进行公平分发,处理快的处理的多,处理慢的处理的少;按劳分配

    实际代码上的区别就是公平分发一定要设置应答方式为手动应答,而轮询模式设置为自动应答:

    //根据实际场景设置:取决于服务的处理速度、磁盘空间等,为1表示每次只消费1条
    finalChannel.basicQos(1); //公平分发一定需要手动应答 finalChannel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);

     2.3.发布订阅模式 Publish/Subscribe

    发布订阅模式使用fanout类型交换机绑定每一个消费者Queue队列,相当于广播的形式,订阅了该交换机(频道)的Queue都会收到通过交换机发送的来自生产者的消息。

    而在此过程中消费者Queues必须与fanout_exchange进行一对一绑定。

     

     2.4.路由模式Routing

    路由模式的交换机类型是:direct类型

    路由模式与发布订阅模式非常相似,也非常容易理解。它只是在发布订阅模式上新增了路由key,通过对应的路由key与对应的Queue进行绑定,这个Queue就被key唯一标识了。

    然后当交换机再去发送消息的时候,会在绑定了交换机的Queue中指定对应的路由key进行发送,只有对应路由key为发送key一一对应的才能收到消息。

    测试发给Routing key为error的queue队列(队列都绑定了路由direct_exchange):

     

     

     2.5.主题Topic模式

    主题模式topics相较于路由模式是非常相似的,只不过在路由的基础之上增加了支持模糊匹配的Routing key的形式。 

    主题模式的交换机类型选择必须是topic类型。

    匹配规则:

    #:表示0个或者多个,取值范围为[0,+无穷大)

    *:表示1个,取值为1,即必须要有一个。

    测试队列Routing key如下,都绑定上了topic主题类型的交换机:

     

    可以看到,只有queue1与queue2收到了对应的消息:

     

    2.6.参数模式

    参数模式的exchange类型为:headers。

    参数模式会在路由匹配时根据相应的Queue携带的参数信息进行匹配,而exchange则根据arguement参数进行一对一发送:

    Arguments信息标识,测试选择x=1的队列进行发送:

     

    可以看到queue1中已经收到了消息:

     

    3.总结

    RabbitMQ支持的消息模式:

    简单模式 Simple

    • 交换机类型:default
    • 特点:通过默认交换机实现一对一分发

    工作模式 Work

    •  交换机类型:default
    • 特点:轮询分发:按均分配;公平分发:按劳分配;

    发布订阅模式

    • 交换机类型:fanout
    • 特点:订阅频道,每个队列与交换机绑定,都能收到消息

    路由模式

    • 交换机类型:direct
    • 特点:有route key作为标识,发送消息时通过路由key进行一对一发送,实际性能会有所损耗

    主题模式

    • 交换机类型:topic
    • 特点:在route key基础上增加了模糊匹配,#:0个或者多个;*:必须有一个

    参数模式

    • 交换机类型:headers
    • 特点:携带参数Arguments,实际发送与有对应参数的队列相匹配进行发送
  • 相关阅读:
    服务端TextBox焦点事件
    Ajax进度条动画制作网址
    ADSL错误代码大全
    ASP.NET MVC Framework体验(5):路径选择(URL Routing)(转)
    为表添加一列IsUpload默认值为0
    ASP.NET MVC Framework体验(3):表单提交(转)
    .NET开源项目
    Vista文件共享
    mysql的to_days函数
    Samba简介
  • 原文地址:https://www.cnblogs.com/yif0118/p/14665274.html
Copyright © 2011-2022 走看看