欢迎大家关注我公众号“从零开始的it转行生”

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(三)-交换机

posted @ 2020-11-18 18:43  大佬健  阅读(149)  评论(0编辑  收藏  举报

欢迎大家关注我公众号“从零开始的it转行生”