• rabbitmq(二)-概念介绍


    rabbitmq 概念介绍

    上一篇文章rabbitmq(一)-基础入门介绍了如何快速使用rabbitmq,这一篇主要对rabbitmq做一些概念和介绍,和管理后台的使用。

    主要涉及的概念有:

    1. broker
    2. product
    3. consumer
    4. queue
    5. exchange
    6. binding
    7. connection
    8. channel

    rabbitmq概念图

    broker

    broker是rabbitmq的实例代表;
    一个rabbitmq代表一个broker;
    在管理台的页面显示为node:

    product

    生产者,负责发送消息的client

    consumer

    消费者,就是接收消息的一方。
    消费者连接到 RabbitMQ 服务器,并订阅到队列上。
    当消费者消费一条消息时,只是消费消息的消息体( payload )。

    queue

    队列,用于存储消息;
    rabbitmq中消息都只能存储在队列中,这点和 Kafka 这种消息中间件相反
    Kafka 将消息存储在 topic (主题)这个逻辑层面,而相对应的队列逻辑只是 topic 实际存储文件中的位移标识。
    RabbitMQ 的生产者生产消息井最终技递到队列中,消费者可以从队列中获取消息并消费。

    多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊(Round-Robin ,即轮询)给多个消费者进行处理,而不是每个消费者都收到所有的消息井处理。


    可以点底部的add queue按钮来新建队列

    有关queue的属性介绍在另外的文章。

    exchange

    交换器;
    在rabbitmq中,生产者是先将消息发送到 Exchange;
    由交换器将消息路由到一个或者多个队列中。
    逻辑图如下:

    RabbitMQ 中的交换器有四种类型,不同的类型有着不同的路由策略。

    1. direct交换机
    2. faout交换机
    3. topic交换机
    4. head交换器

    在管理页面中exchange的位置如下;

    点进去可以看多一些有关exchange的属性

    如图显示这是一个direct类型的、持久化的交换机。

    有关4种exchange的用法和属性介绍在rabbitmq(三)- 交换机

    binding

    绑定,RabbitMQ 中通过绑定将交换器与队列关联起来
    在绑定的时候一般会指定一绑定键( BindingKey ,这样 RabbitMQ 就知如何何正确地将消息路由到队列了。
    一个exchange可以绑定多个queue。
    一个queue可以绑定多个exchange。

    管理后台页面

    最下面的按钮可以自行创建binding

    connection

    连接
    我们知道无论是生产者还是消费者,都需要和 RabbitMQ Broker 建立连接,这个连接就是一条 TCP 连接,也就是Connection。

    管理台页面

    channel

    AMQP 信道( Channel) ,
    一旦连接建立起来,客户端紧接着可以创建一个 AMQP 信道( Channel) ,每
    个信道都会被指派一个唯一的ID,信道是建立在Connection之上的虚拟连接,rabbitmq处理的每条指令都是通过channel来完成的。

    管理台页面

    也可以查看consumer在用哪个channel

    问题1 为什么要用channel?

    答:因为一个connection对应一个tcp连接,
    如果每个线程都创建一个connection,也就是许多个 TCP 连接。
    然而对于操作系统而言,建立和销毁 TCP 连接是非常昂贵的开销。
    RabbitMQ 采用类似 NIO (Non-blocking 110 )的做法,选择 TCP 连接复用,不仅可以减少性能开销,同时也便于管理。

    每个线程把持一个信道,所以信道复用了 Connection TCP 连接。
    同时 RabbitMQ 可以确保每个线程的私密性,就像拥有独立的连接一样。
    当每个信道的流量不是很大时,复用单Connection 可以在产生性能瓶颈的情况下有效地节 TCP 连接资源。
    但是当信道本身的流量很大时,这时候多个信道复用一个 Connection 就会产生性能瓶颈,进而使整体的流量被限制了。
    此时就需要开辟多个 Connection ,将这些信道均摊到这些 Connection 中,至于这些相关的调优策略需要根据业务自身的实际情况进行调节.

    问题2 Connection与channel的区别?

    答:Connection 可以用来创建多个 Channel 实例,但是 Channel 实例不能在线程问共享,应用程序应该为每一个线程开辟一个 Channel 。
    某些情况下 Channel 的操作可以并发运行,但是在其他情况下会导致在网络上出现错误的通信帧交错,多线程问共享 Channel 实例是非线程安全的。

    问题3 一个channel应该对应一个consumer还是多个consumer?

    答:最常用的做法是一 Channel 对应一个消费者;
    也就是意味着消费者彼此之间没有任何关联。
    当然也可以在一个 Channel 中维持多个消费者。
    但是要注意一个问题,
    如果 Channel 中的 个消费者一直在运行,那么其他消费者的 callback会被“耽搁”。

    RabbitMQ 发送消息的运转流程

    1、product与broker建立一个connection,然后在connection上面开启一个channel。
    2、product声明一个exchange。
    3、product声明一个queue。
    4、product在exchange与queue建立一个binding。
    5、product把消息发送到broker中。
    6、broker根据excahnge把消息路由到对用的queue中。
    7、关闭channel。
    8、关闭connection。

    其他相关文章:
    rabbitmq(一)-基础入门
    rabbitmq(二)-概念介绍
    rabbitmq(三)-交换机

  • 相关阅读:
    Select 多个表并且相关联转置
    Excel输入公式后只显示公式却不计算如何解决?
    Excel 下来公式 内容却一样
    MySQL数据迁移到SQL Server
    C# Excel 中设置文字对齐方式、方向和换行
    Response.write()弹出窗口的问题!
    ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务
    Hibernate中连接数据库的配置
    ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
    帝国cms的tags页面url伪静态的设置
  • 原文地址:https://www.cnblogs.com/yeyongjian/p/14001492.html
Copyright © 2020-2023  润新知