• 198、RabbitMQ 的核心概念 及 工作机制概述; Exchange 类型 及 该类型对应的路由规则;了解什么是JMS。


    RabbitMQ 之前,可以先了解下什么是 JMS。

    JMS 讲解

    先简单看下 JMS 是什么,用来对比。
    JMS 也是一种消息机制
    JMS 规范,属于 Java EE 规范
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    AMQP ( Advanced Message Queuing Protocol ) 高级消息队列协议
    在这里插入图片描述

    ★ RabbitMQ的核心概念

    Connection: 代表客户端(包括消息生产者和消费者)与RabbitMQ之间的连接。

    Channel: 连接内部的Channel。

    Exchange: 充当消息交换机的组件。

    Queue: 消息队列。

    ★ RabbitMQ工作机制

    AMQP ( Advanced Message Queuing Protocol ) 高级消息队列协议
    RabbitMQ 是一种属于 AMQP 这种协议的消息组件。
    RabbitMQ 是遵循 AMQP 的一个实现

    ▲ 原有JMS只有三层:

    消息生产者---------->消息目的---------->消息消费者

    ▲ AMQP(RabbitMQ)增加了一层

    消息生产者----------Exchange-----------消息队列(目的)----------消息消费者

    同理,无论是消息生产者,还是消息消费者,它们都使用Connection与消息Broker之间建立连接——这一点与JMS是一样。

    RabbitMQ的消息生产者、消息消费者实际与消息Broker通信的是Channel,
    JMS实际则使用Session。

    在这里插入图片描述

    ★ Connection(连接) 与 Channel(通信信道)

    ▲ 不管是消息生产者,还是消息消费者,它们都要通过Connection建立与RabbitMQ之间的连接,因此Connection就代表客户端与RabbitMQ之间的连接。

    ▲ 但客户端与RabbitMQ之间实际通信所用的是Channel(信道),这是因为RabbitMQ采用了类似于Java NIO的做法,避免为应用程序中的每个线程都建立单独的连接,因此是使用Channel来复用连接,这样不仅可以降低性能开销,而且也便于管理。

    简单两句话:

     - Connction代表了客户端与消息Broker之间的连接。建立连接用Connection。
    
     - Channel代表了客户端与消息Broker之间的通信信道。实际通信用Channel。
       Channel位于Connection之内,也就是说,Channel必须通过Connection来获得。
    
    • 1
    • 2
    • 3
    • 4

    ★ Exchange

    消息生产者发送消息时,只需指定两个关键信息:

     - exchange:将该消息发送到哪个Exchange。
     - routing key:消息的路由key。该路由key会决定消息要被路由到哪些消息队列。
    
    • 1
    • 2

    RabbitMQ的消息生产者只需指定将消息发送到哪个Exchange,Exchange相当于消息交换机,

    ▲ Exchange 它会根据自身的类型和消息的路由key(routing key),将消息分发到一个或多个消息队列(Queue)
    消息实际依然由于消息队列来负责管理。
    消息由Exchange负责分发。

    ▲ 简单来说:
    消息生产者将消息发送给Exchange,Exchange负责将消息分发给对应的Queue,Exchange分发消息的关键在于它本身的类型和路由key。

    ▲ 消息生产者发送消息时,与消息队列是无关的。(只跟exchange和routing key有关)

    ▲ 消息消费者接收消息时,只需从指定消息队列中获取消息即可,与Exchange是无关的。
    (只跟消息队列有关)

    ★ Exchange与Queue

    ▲ 为了让Exchange能将信息分发给Queue,Queue需要将自己绑定到Exchange上(也就是让Exchange来管理多个Queue),
    Exchange只会将消息分发给绑定到自己的Queue,没有绑定的Queue不会得到Exchange分发的消息。

    将Queue绑定到Exchange的过程,就相当于将Queue注册到Exchange的过程。

    ▲ 将Queue绑定到Exchange时,也需要指定一个路由key。

    ▲ Exchange就根据发送消息时指定的路由key、绑定Queue时指定的路由key来决定要将消息分发给哪些Queue。

    【备注】:路由key(就是个字符串),两个地方需要用到:

    A:将Queue绑定到Exchange时,需要指定路由key。

    B:发送消息时,需要Exchange和路由key。




    ★ Exchange的类型(4种)及 该类型对应的路由规则


    Exchange来分发消息时,要看Exchange本身的类型、消息的路由key。

    fan:扇子  out:出现、向外   fanout:扇出、展开、散开、分列
    
    • 1

    fanout: 广播Exchange这种类型的Exchange会将消息广播到所有与它绑定的Queue。
    这种类型的Exchange在分发消息时不看路由key。
    只要将消息发送到该Exchange,该消息就会被自动广播所有消息队列——这就是典型的Pub-Sub模型。

    direct: 这种类型的Exchange将消息直接发送到路由key对应的队列。
    direct:笔直的、径直的
    消息队列绑定到Exchange时,要指定路由key;
    发送消息时,也要指定路由key;
    就是使用direct类型的Exchange只有当两个路由key完全相同时,该消息队列才能被分发消息

    topic: 这种类型的Exchange在匹配路由key时支持通配符,相当于它是增强型的direct

    【备注】:此处的topic类型的Exchange与JMS的消息主题没有半毛钱的关系。

    headers: 这种类型的Exchange要根据消息自带的头信息进行路由。这种类型比较少用。




    消息发送到消息队列的一些示例:

    如图:假设消息生产者又发送了一条消息,路由key 是 abc , 那么这个 路由key 是 abc 的 消息,在发送到 exchange 之后,就会直接被丢弃了,因为 exchange 绑定的众多 queue 消息队列中,没有对应的 路由key 是 abc。所以这个消息不会分发给任何的消息队列。
    在这里插入图片描述

     路由key通配符解释:
     
     单词与单词之间用【  .   点号】隔开, 
     比如:路由key是:aaa.bbb.ccc   ,就表示这个路由key是由三个单词组成的。
    
    【* . crazyit . * 】 表示这个 路由key 只能是三个单词组成,第一个和第三个单词随便,
    但是中间的单词一定要是 crazyit  ,才可以匹配上。
    
    【* . org】 表示这个 路由key 只能是两个单词组成,第一个单词随便,
    但是第二个单词一定要是 org,才可以匹配上
    
    【# . org】 # 号代表0-N 个单词,表示这个 路由key 是多个单词组成,或者只有一个 org 也算匹配上。
     org 前面有多少个单词都没问题,或者没单词也可以,只要最后一个单词是 org , 那么就可以匹配上。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

  • 相关阅读:
    java对一些文件格式的操作(读写)
    DeepLearning[花书] 参考资料
    父子工程搭建
    java社区疫情防控微信小程序源码
    Vue3中使用el-table遇到的问题
    Javaweb基础-前端工程化学习笔记
    蓝桥杯备赛(Day5)——二叉树
    科普:什么是视频监控平台?如何应用在场景中?
    NFT 作品集推荐|Lululand《爱是永恒》
    第14章 多线程二 (线程调度)
  • 原文地址:https://blog.csdn.net/weixin_44411039/article/details/133686920