rabbitMq信道(channel)

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.总之就是根据自身情况调节:一个连接多个信道、一个信道多个消息、多个连接多个信道

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章