RabbitMQ中的Connection和Channel信道详解

 更新时间:2023年08月28日 10:29:38   作者:LiZhen798  
这篇文章主要介绍了RabbitMQ中的Connection和Channel信道详解,信道是建立在 Connection 之上的虚拟连接,RabbitMQ 处理的每条 AMQP 指令都是通过信道完成的,需要的朋友可以参考下

RabbitMQ的Connection和Channel

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

一旦 TCP 连接建立起来,客户端紧接着可以创建一个 AMQP 信道(Channel),每个信道都会被指派一个唯一的 ID。

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

我们完全可以使用 Connection 就能完成信道的工作,为什么还要引入信道呢?

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

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

RabbitMQ 采用类似 NIO(Non-blocking I/O)的做法,选择 TCP 连接复用,不仅可以减少性能开销,同时也便于管理。

每个线程把持一个信道,所以信道复用了 Connection 的 TCP 连接。

同时 RabbitMQ 可以确保每个线程的私密性,就像拥有独立的连接一样。当每个信道的流量不是很大时,复用单一的 Connection 可以在产生性能瓶颈的情况下有效地节省 TCP 连接资源。

但是信道本身的流量很大时,这时候多个信道复用一个 Connection 就会产生性能瓶颈,进而使整体的流量被限制了。

此时就需要开辟多个 Connection,将这些信道均摊到这些 Connection 中,至于这些相关的调优策略需要根据业务自身的实际情况进行调节。

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

比如 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 用于监听多个信道的时间(比如连接打开,数据到达等)。因此,单线程可以监听多个数据的信道。

到此这篇关于RabbitMQ中的Connection和Channel信道详解的文章就介绍到这了,更多相关RabbitMQ的Connection和Channel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈java中的路径表示

    浅谈java中的路径表示

    下面小编就为大家带来一篇浅谈java中的路径表示。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • MyBatis XML方式的基本用法之多表查询功能的示例代码

    MyBatis XML方式的基本用法之多表查询功能的示例代码

    这篇文章主要介绍了MyBatis XML方式的基本用法之多表查询功能的示例代码,本文通过示例文字相结合的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • Java实现为图片添加水印功能

    Java实现为图片添加水印功能

    在图像处理领域,水印是一种常见的保护版权和标识图片归属的方法,Java提供了强大的图像处理能力,可以通过Graphics2D类在图像上绘制水印,下面我们来看看具体操作步骤吧
    2025-02-02
  • idea创建SpringBoot自动创建Lombok无效果的问题解决方案

    idea创建SpringBoot自动创建Lombok无效果的问题解决方案

    这篇文章主要介绍了idea创建SpringBoot自动创建Lombok无效果的问题解决方案,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • 解决Nacos成功启动但是无法访问 (Connection refused)

    解决Nacos成功启动但是无法访问 (Connection refused)

    这篇文章主要介绍了解决Nacos成功启动但是无法访问 (Connection refused)问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • 创建自定义的Java注解类的方法

    创建自定义的Java注解类的方法

    这篇文章主要介绍了创建自定义的Java注解类的方法,主要部分为创建一个带有Java类型@interface的新类型,需要的朋友可以参考下
    2015-07-07
  • Java删除二叉搜索树的任意元素的方法详解

    Java删除二叉搜索树的任意元素的方法详解

    这篇文章主要介绍了Java删除二叉搜索树的任意元素的方法,结合实例形式详细分析了java这对二叉搜索树的遍历、查找、删除等相关操作技巧与使用注意事项,需要的朋友可以参考下
    2020-03-03
  • 使用Sentinel实现流控和服务降级的代码示例

    使用Sentinel实现流控和服务降级的代码示例

    Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,本文将详细为大家介绍如何使用Sentinel实现流控和服务降级,文中有相关的代码示例,需要的朋友可以参考下
    2023-05-05
  • Spring Aware接口示例代码详解

    Spring Aware接口示例代码详解

    Spring的依赖注入的最大亮点是所有的Bean对Spring容器的存在是没有意识的,我们可以将Spring容器换成其他的容器,Spring容器中的Bean的耦合度因此也是极低的,本文给大家介绍Spring Aware接口示例代码详解,感兴趣的朋友一起看看吧
    2022-02-02
  • Java之Spring注解配置bean实例代码解析

    Java之Spring注解配置bean实例代码解析

    这篇文章主要介绍了Java之Spring注解配置bean实例代码解析,具有一定参考价值,文中还有有关Spring学习的资料下载链接及相关内容推荐,需要的朋友可以了解下。
    2017-09-09

最新评论