【RabbitMQ——核心组成部分以及AMQP协议】

1. 流转过程

1.1 AMQP生产者的流转过程

1.2 AMQP消费者流转过程

2. RabbitMQ

2.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,消息队列,保存消息并将它们转发给消费者。

2.2 RabbitMQ的整体架构

2.3 RabbitMQ的运行流程

3. RabbitMQ支持的消息模式

3.1 交换机exchange

  • direct(路由模式)
    • 可以指定routerKey
  • fanout(订阅和发布模式)
    • 指定routerKey毫无意义,所有的订阅者依旧会收到
  • headers(参数模式)
  • 携带指定参数的queue才能接收到message
  • topic(模糊路由模式)
    • 主题模式
    • 可以进行模糊匹配routerKey
    • #代表0个或多个
    • *代表一个
java 复制代码
 // 准备交换机
 String exchangeName = "direct_message_exchange";
 String exchangeType = "direct";
 // 声明交换机:交换机的名称、类型、是否持久化
 channel.exchangeDeclare(exchangeName, exchangeType, true);
 // 声明队列:队列、是否持久化、是否排他、是否自动删除,队列是否携带参数
 channel.queueDeclare("queue5",true,false,false,null);
 channel.queueDeclare("queue6",true,false,false,null);
 channel.queueDeclare("queue7",true,false,false,null);
 // 绑定队列和交换机的关系
 channel.queueBind("queue5",exchangeName,"order");
 channel.queueBind("queue6",exchangeName,"order");
 channel.queueBind("queue7",exchangeName,"course");

3.2 Work模式

3.2.1 轮询模式(Round-Robin)

特点:该模式接收消息是当有多个消费者接入时,消息的分配模式是一个消费者分配一条,直至消息消费完成;

java 复制代码
Channel finalChannel = channel;
// 设置消息为自动应答
finalChannel.basicConsume("queue1", true, new DeliverCallback() {
    @Override
    public void handle(String s, Delivery delivery) throws IOException {
        try{
            System.out.println("Work1-收到消息是:" + new String(delivery.getBody(), "UTF-8"));
            Thread.sleep(2000);
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}, new CancelCallback() {
    @Override
    public void handle(String s) throws IOException {
    }
});

3.2.2 公平模式(Fair-Robin)

特点:由于消息接收者处理消息的能力不同,存在处理快慢的问题,我们就需要能者多劳,处理快的多处理,处理慢的少处理;

java 复制代码
// 6: 定义接受消息的回调
Channel finalChannel = channel;
// fair模式下一定要设置消息消费确认为手动
finalChannel.basicQos(1);//每次从队列中取多少条,必须要设置
finalChannel.basicConsume("queue1", false, new DeliverCallback() {
    @Override
    public void handle(String s, Delivery delivery) throws IOException {
        try{
            System.out.println("Work1-收到消息是:" + new String(delivery.getBody(), "UTF-8"));
            Thread.sleep(2000);
            finalChannel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}, new CancelCallback() {
    @Override
    public void handle(String s) throws IOException {
    }
});
相关推荐
廋到被风吹走1 小时前
【消息队列】选型深度对比:Kafka vs RocketMQ vs RabbitMQ
kafka·rabbitmq·rocketmq
YE1234567_1 小时前
从底层零拷贝到分布式架构:深度剖析现代 C++ 构建超大规模高性能 AI 插件引擎的实战之道
c++·分布式·架构
笃行客从不躺平2 小时前
Seata + AT 模式 复习记录
java·分布式
洛阳纸贵2 小时前
JAVA高级工程师-消息中间件RabbitMQ工作模式(二)
java·rabbitmq·java-rabbitmq
像少年啦飞驰点、2 小时前
Java大厂面试真题:Spring Boot + Kafka + Redis 在电商场景下的实战应用
java·spring boot·redis·分布式·kafka·面试题·电商秒杀
徐先生 @_@|||3 小时前
基于Spark配置+缓存策略+Junpyter Notebook 实现Spark数据加速调试
大数据·分布式·缓存·spark
小北方城市网3 小时前
微服务接口熔断降级与限流实战:保障系统高可用
java·spring boot·python·rabbitmq·java-rabbitmq·数据库架构
无心水3 小时前
【分布式利器:腾讯TSF】11、腾讯TSF微服务框架深度对比:全面解析TSF vs Spring Cloud vs Dubbo vs Service Mesh
分布式·spring cloud·微服务·dubbo·springcloud·service mesh·分布式利器
云草桑4 小时前
在C# .net中RabbitMQ的核心类型和属性,除了交换机,队列关键的类型 / 属性,影响其行为
c#·rabbitmq·.net·队列
徐先生 @_@|||4 小时前
大数据处理框架(Hadoop VS PySpark)
大数据·hadoop·分布式·spark·k8s·yarn