深入理解Spring中RabbitMQ的Channel

 更新时间:2023年08月28日 09:17:12   作者:Sam_Deep_Thinking  
这篇文章主要介绍了深入理解Spring中RabbitMQ的Channel,在RabbitMq中,channel表示逻辑连接或者叫虚拟连接,是棣属于TCP连接的,一个TCP连接里可以创建多个channel,在Rabbit MQ里,消息的发送和接收都是基于channel的,需要的朋友可以参考下

概述

在 AMQP 协议中,有 channel 的概念,在 RabbitMq 中, channel 表示逻辑连接或者叫虚拟连接,是棣属于 TCP 连接的。

一个 TCP 连接里可以创建多个 channel ,在 Rabbit MQ 里,消息的发送和接收都是基于 channel 的。

connection和channel的关系

有了 TCP 连接后,还需要 channel 的原因如下:

  • 创建和销毁TCP连接很耗时;
  • 打开太多TCP连接,耗操作系统资源,并发量大到一定程度,系统的吞吐量会降低;
  • 使用一个connection多channel的方式,可以提升连接的利用率。

因此采用多个 channel 多路复用一个 TCP 连接的方式才比较合理。

channel线程不安全

channel 不是线程安全的,线程并发的去访问同一个 channel 会出问题。

这里有几种处理方式:

  1. 全局公用一个channel且使用全局锁,让操作channel排队.这种明显性能是不行的;
  2. 一个线程对应创建一个新的channel,但是要处理好一个连接能支撑的最大channel数量;
  3. 一个线程对应一个channel,但是是从channel池子拿的,不是每次都创建新的.一旦一个线程完成了一个channel的使用,它将返回到池中,从而使该channel可用于另一个线程。

量不大的话,使用第二种方式就可以了。量大的话,建议使用第三种方式,毕竟创建和销毁 channel 也是耗时耗资源的.在 spring amqp 中,提供了一个缓存 channel 的方案。

可以在创建 CachingConnectionFactory 时指定缓存的模式。

connectionFactory.setCacheMode(CachingConnectionFactory.CacheMode.CHANNEL);
connectionFactory.setChannelCacheSize(25);

上面的两行代码,表示 channel 共用唯一的一个连接,且缓存了25个 channel ,注意这里的25个并不是说,这个连接里只能最多创建25个 channel ,而是说最多缓存25个 channel 。举个例子,假设并发发送100条消息,在 CachingConnectionFactory.CacheMode.CHANNEL 模式下,瞬间会创建100个 channel 的,然后往缓存里放25个 channel ,当流量下去了,刚刚创建的多余的 channel 会自动关闭掉的,缓存里只保留25个。

使用这种方式的话,要注意缓存的 channel 数量,不能太小,不然流量一大,仍然会造成频繁关闭 channel 的情况。当然我们也不能说有多少并发,就创建多少个 channel ,还是要限制一下,这个时候可以使用:

connectionFactory.setChannelCheckoutTimeout(1000);

当 ChannelCheckoutTimeout 的值大于0的时候, ChannelCacheSize 的值就是最大的 channel 数量了,一旦从缓存中获取不到 channel ,等待 ChannelCheckoutTimeout 毫秒后,如果还是获取不到的,就会抛 AmqpTimeoutException 了。

我们也可以自己实现 channel pool ,但是不太建议怎么做,毕竟 spring amqp 还是相当成熟的,直接使用就可以了。

CacheMode.CHANNEL模式性能

如上文所述,采用了 CacheMode.CHANNEL 的模式的话,就是一线程一 channel 形式,且这些 channel 共享了同一个连接,也即是共享同一个 socket

当并发量一大的时候,可能导致同一时刻,多个线程都想往这个 socket 上写数据。

为了避免这种情况,只能加锁,让拿不到锁的线程 block 住。做了压力测试,并发10个线程发送1000000条消息,结果线程被 block 住了,如下图:

在这里插入图片描述

作者也提到,当流量很大的时候,使用 CacheMode.CONNECTION 的模式,可以提高发送效率。

channel的监控

RabbitMQ Admin UI 提供了一个监控 channel 的界面,我们主要关注两点:

channel有没有可能泄露,打开了channel,却没有关闭channel;打开channel和关闭channel的速率。

如果通道打开操作的速率始终高于通道关闭操作的速率,那就可能发生 channel 泄露了。

如下图:

在这里插入图片描述

如果打开和关闭 channel 的速率都很高,也值得观察一下。因为可能是没有缓存 channel 了。

当流量继续增大的时候,可能会出现吞吐量上不去的情况,如下图:

在这里插入图片描述

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

相关文章

  • Java中ArrayList和LinkedList的遍历与性能分析

    Java中ArrayList和LinkedList的遍历与性能分析

    这篇文章主要给大家介绍了ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论。相信对大家的理解和学习具有一定的参考价值,有需要的朋友们下面跟着小编一起来学习学习吧。
    2016-12-12
  • java使用缓冲流复制文件的方法

    java使用缓冲流复制文件的方法

    这篇文章主要为大家详细介绍了java使用缓冲流复制文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • SpringCloud中的openFeign调用服务并传参的过程

    SpringCloud中的openFeign调用服务并传参的过程

    服务和服务之间通信,不仅仅是调用,往往在调用过程中还伴随着参数传递,接下来重点来看看OpenFeign在调用服务时如何传递参数,感兴趣的朋友一起看看吧
    2023-11-11
  • java 语句块的使用详解及实例

    java 语句块的使用详解及实例

    这篇文章主要介绍了java 用语句块的正确方法实例详解的相关资料,需要的朋友可以参考下
    2017-01-01
  • 简单说明Java的Struts框架中merge标签的使用方法

    简单说明Java的Struts框架中merge标签的使用方法

    这篇文章主要简单介绍了Java的Struts框架中merge标签的使用方法,Struts是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • Java设计模式之动态代理模式实例分析

    Java设计模式之动态代理模式实例分析

    这篇文章主要介绍了Java设计模式之动态代理模式,结合实例形式分析了动态代理模式的概念、功能、组成、定义与使用方法,需要的朋友可以参考下
    2018-04-04
  • SpringBoot学习系列之MyBatis Plus整合封装的实例详解

    SpringBoot学习系列之MyBatis Plus整合封装的实例详解

    MyBatis-Plus是一款MyBatis的增强工具(简称MP),为简化开发、提高效率,这篇文章给大家介绍MyBatis Plus整合封装的实例详解,感兴趣的朋友跟随小编一起看看吧
    2020-08-08
  • Java Web中Ajax技术使用方法介绍

    Java Web中Ajax技术使用方法介绍

    ajax技术是使页面能局部刷新的一种技术,下面这篇文章主要给大家介绍了关于JavaWeb之Ajax的基本使用与实战案例的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • Spring Cloud Alibaba 本地调试介绍及方案设计

    Spring Cloud Alibaba 本地调试介绍及方案设计

    为了解决 本地调试 的问题,本文实现了一种简单实用的策略,可以通过 Nacos 动态配置服务路由,还可以基于用户,部门,组织等级别配置服务路由,实现 本地调试 的同时,实际上也实现 灰度发布,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • SpringBoot + MyBatis-Plus构建树形结构的几种方式

    SpringBoot + MyBatis-Plus构建树形结构的几种方式

    在实际开发中,很多数据都是树形结构,本文主要介绍了SpringBoot + MyBatis-Plus构建树形结构的几种方式,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08

最新评论