rabbitMq信道(channel)

探讨了RabbitMQ中TCP连接与AMQP信道的建立与管理,包括信道的线程安全性、信道与连接的检测方法,以及在高并发场景下如何合理配置信道与连接以提升性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.与Rabbitmq Broker建立连接,这连接就是一个TCP连接,也就是connection.

2.建立TCP连接后,客户端可以创建一个AMQP信道(Channel),每个信道都会被指派一个唯一的ID。信道是建立在Connection之上的虚拟连接,RabbitMq处理的每条AMQP指令都是通过信道完成的。

3.Connection可以创建多个Channel实例,但是Channel实例不能在线程间共享,应用程序应该为每一个线程开辟一个Channel。多线程间共享Channel实例是非线程安全的(1.导致在网络上出现错误的通信帧交错 2.也会影响发送方确认机制的运行)

4.Channel或者Connection中有个isOpen方法可以用来检测是否处于开启状态。(并不推荐在线上代码使用,这个方法返回值依赖于shutdownCaunse的存在,有可能会产生竞争)

5.通常情况下,在调用createXXX或者newXXX方法之后,我们可以简单滴认为Connection或者Channel已经成功地处于开启状态,而并不会在代码中使用isOpen这个检测方法。如果在使用Channel的时候其已经处于关闭状态,那么程序会抛出一个com.rabbitmq.cilent.ShutdownSignalException,我们只需要捕获这个异常即可。当然同时也要试着捕获IOException或者SocketException,以防Connetion意外关闭。

 

使用延伸:

多个TCP连接的建立和销毁是非常昂贵的开销,如果遇到使用高峰,性能瓶颈也随之显现。RabbitMq采用类似NIO(非阻塞I/O,包含核心三大部分:Channel信道、Buffer缓冲区和Seletor选择器。NIO基于Channel和Buffer进行操作,数据总是从信道读取数据到缓冲区,或者从缓冲区写去到信道中。Seletor用于监听多个信道的事件(比如链接打开,数据到达等)。因此,单线程可以监听多个数据的信道)的做法,选择TCP连接复用,不仅可以减少性能开销,同时也便于管理。

 

1.每个线程把持一个信道,信道复用了Cnnection的TCP连接。同时RabbitMq可以确保每个线程的私密性,就像拥有独立的连接一样。

2.但当每个信道的流量很大时,这时候需要开辟多个Connection,将这些信道均摊到这个TCP连接中,否则导致整个Connection连接的流量被限制。

3.总之就是根据自身情况调节:一个连接多个信道、一个信道多个消息、多个连接多个信道

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值