• RabbitMQ介绍篇(一)


    RabbitMQ是一个消息代理 , 一个消息系统的媒介。它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全。

    RabbitMQ的5大核心概念: Connection (连接),Channel (信道) , Virtual host (虚拟主机),Exchange (交换机) , Queue (队列),

    为了大家便于理解,我们先来看一张图,这张图说明了RabbitMQ 的工作模型。

    在这里插入图片描述

    其中,Broker 表示 RabbitMQ 服务,每一个RabbitMQ 至少会存在一个 Virtual host (虚拟主机),而每一个虚拟主机有自己的交换机,队列。

    生产者和消费者与RabbitMQ 建立连接时,客户端【生产者和消费者】会创建多个信道【虚拟连接】,用来发送和接收消息。

    Connection (连接)

    每个生产者和消费者要通过RabbitMQ 发送和消费 消息,都需要和RabbitMQ 建立连接,也是一个TCP长连接。

    Channel (信道)

    Channel是Connection的基础上建立的虚拟连接,RabbitMQ 处理的每条AMQP 指令都是通过信道完成的。

    这里简单说一下AMQP 模型: 生产者通过routing key 投递消息到exchange,exchange根据routing key 与binding key 进行映射 ,然后路由投递到具体队列。

    依据Connection 的功能就能完成信道的工作,为啥我们还要引入信道呢?

    :如果有这样的一个场景,一个应用程序有很多个线程从RabbitMQ 中生产或消费 消息,那必然需要建立很多个Connection ,也是多个 TCP 连接。

    而对于操作系统而言,建立和销毁 TCP 连接是非常昂贵的开销,如果遇到使用高峰,性能瓶颈也随之显现。

    RabbitMQ 采用类似 NIO,选择 TCP 连接复用,不仅可以减少性能开销,同时也便于管理。

    每个线程一个信道,这样就复用了Connection 的TCP连接,每一个信道上会指派一个唯一的ID , 这样也保证了消息的独立性及安全,信道之间完全是隔离的。

    Virtual host (虚拟主机)

    Virtual host 是一个虚拟主机的概念,一个RabbitMQ 中可以至少会存在一个 Virtual host,每一个Virtual host 都会有自己的交换机和队列,同一个Virtual host 中的交换机和队列都不能有重名的,不同的Virtual host 中交换机 和 队列 可以重名,这样不同的用户在访问同一个RabbitMQ服务时,可以创建单独的虚拟主机,然后在自己的虚拟主机上创建交换机和队列,很好的做到了不同用户之间相互隔离的效果。

    Queue (队列)

    Queue 是一个用来存放消息的队列,生产者发送的消息会被放到消息队列中,消费者消费消息时,也是从队列中取走消息。

    Exchange (交换机)

    Exchange是一个很重要的概念,它是消息到达RabbitMQ的第一站,主要负责根据不同的分发规则将消息分发到不同的Queue,供订阅了相关Queue的消费者消费到指定的消息。那Exchange有哪些分发消息的规则呢?这就要说到Exchange的4种类型了:direct、fanout、topic、headers。

    • Direct类型
      也是默认类型,在没有指定type的exchange时,默认就是direct 类型。direct的意思是直接的,direct类型的Exchange会将消息转发到指定Routing-key的Queue上,Routing-key的解析规则为精确匹配。也就是只有当producer发送的消息的Routing-key与某个Binding-key相等时,消息才会被分发到对应的Queue上,如果没有匹配到对应的Queue上 ,该消息会丢失。它的适用场景其实和广播模式有些相像,只不过是设置了允许的条件(如L:Routing-key 等于 Binding-key)。

      这里举个例子: 生产者Routing-key(路由键名称:order) 指向 Direct类型交换机(名称:my-direct-exchange) , 这个交换机下面绑定了三个queue,binding-key分别是order/good/stock ,然后我们向该Exchange(my-direct-exchange)中发送一条消息,消息的Routing-key是order,按照规则是在binding-key为order的队列上消费的。

      也就是说,direct类型的Exchange在分发消息时,必须保证producer发送消息的Routing-key与Exchange和Queue绑定的Binding-key相等才可以。

    • Fanout类型
      也称广播类型,Fanout类型的Exchange不处理Routing-key,而是会发送到绑定到该交换机上所有queue,它的适用场景,一端发送,多端需要使用,也就是说重复消费(例如:作者推文到每个粉丝里面)

    • Topic类型
      也是主题类型,topic类型的Exchange会根据通配符对Routing-key进行匹配,只要Routing-key满足某个通配符的条件,就会被路由到对应的Queue上。

      通配符的匹配规则如下:

      1. Routing-key必须是一串字符串,每个单词用“.”分隔;
      2. 符号“#”表示匹配一个或多个单词;
      3. 符号“*”表示匹配一个单词。
      
      • 1
      • 2
      • 3

      例如:" *.123 " 能够匹配到 " abc.123 ",但匹配不到 " abc.def.123 “;” #.123 " 既能够匹配到 " abc.123 ",也能匹配到 " abc.def.123 "。

      该类型比较灵活 ,大家可根据自己的场景适用以上类型哦。

    • Headers类型
      该类型就不做描述了,以上3种类型已经能够满足我们所有的需求了。需要了解的同学可以自行百度一下。

  • 相关阅读:
    弘辽科技:拼多多权重怎么补?怎么修复权重?
    14. 一文快速学懂常用工具——etcdctl 命令
    CASAIM自动激光3D测量系统助力海外家电组装企业IQC来料检测装配尺寸测量
    教育类《中学政史地》收稿方向-投稿邮箱
    Zigbee智能家居方案设计
    淘宝/天猫API:item_search_neighbors-邻家好货
    Python —— UI自动化之使用JavaScript进行元素点亮、修改、点击元素
    AttributeError: type object ‘Image‘ has no attribute ‘fromarray‘
    MATLAB 产生式系统 · 推断原神角色
    Centos7.9环境下keepalived结合nginx实现负载均衡的高可用(亲测版)
  • 原文地址:https://blog.csdn.net/weixin_40172337/article/details/126236623