RabbitMQ 中 Connection 和 Channel 详解

咱们知道不管是生产者仍是消费者,都须要和 RabbitMQ Broker 创建链接,这个链接就是一条 TCP 链接,也就是 Connection。性能

一旦 TCP 链接创建起来,客户端紧接着能够建立一个 AMQP 信道(Channel),每一个信道都会被指派一个惟一的 ID。操作系统

信道是创建在 Connection 之上的虚拟链接,RabbitMQ 处理的每条 AMQP 指令都是经过信道完成的。线程

 

 

咱们彻底可使用 Connection 就能完成信道的工做,为何还要引入信道呢?3d

试想这样一个场景,一个应用程序中有不少个线程须要从 RabbitMQ 中消费消息,或者生产消息,那么必然须要创建不少个 Connection,也就是多个 TCP 链接。blog

然而对于操做系统而言,创建和销毁 TCP 链接是很是昂贵的开销,若是遇到使用高峰,性能瓶颈也随之显现。资源

RabbitMQ 采用相似 NIO(Non-blocking I/O)的作法,选择 TCP 链接复用,不只能够减小性能开销,同时也便于管理。it

 

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

 

信道在 AMQP 中是一个很重要的概念,大多数操做都是在信道这个层面展开的。channel

好比 channel.exchangeDeclare、channel.queueDeclare、channel.basicPublish、channel.basicConsume 等方法。程序

RabbitMQ 相关的 API 与 AMQP 紧密相连,好比 channel.basicPublish 对应 AMQP 的 Basic.Publish 命令。

 

名词解释:

NIO,也称非阻塞 I/O,包含三大核心部分:Channel(信道)、Buffer(缓冲区)和 Selector(选择器)。

NIO 基于 Channel 和 Buffer 进行操做,数据老是从信道读取数据到缓冲区中,或者从缓冲区写入到信道中。

Selector 用于监听多个信道的时间(好比链接打开,数据到达等)。所以,单线程能够监听多个数据的信道。

相关文章
相关标签/搜索