连接


说白了就是客户端连接RabbitMQ

首先作为客户端(无论是生产者还是消费者),你如果要与 RabbitMQ 通讯的话,你们之间必须创建一条 TCP 连接,当然同时建立连接后,客户端还必须发送一条“问候语”让彼此知道我们都是符合 AMQP 的语言的,比如你跟别人打招呼一般会说“你好!”,你跟国外的美女一般会说“hello!”一样。你们确认好“语言”之后,就相当于客户端和 RabbitMQ 通过“认证”了。你们之间可以创建一条 AMQP 的信道。
连接在 RabbitMQ 原生客户端(5.0.0)版本中默认使用 java 的原生 socket,但是也支持 NIO,需要手动设置修改。

信道

客户端与 RabbitMQ 的通讯 - 图1
客户端和RabbitMQ连接是通过TCP连接的

信道是包含在TCP之上的,一个线程和RabbitMQ进行通信,会给你一个私密的信道,信道是虚拟连接的一个东西.

有了信道以后,你的线程发一个消息,或者进行一次请求.RabbitMQ响应的时候也会走这个信道, B线程访问RabbitMQ的时候,会走B信道,然后RabbitMQ响应的时候也会从B信道返回,这样保证多个线程引用的私密性.

为什么要使用信道?

信道是生产者/消费者与 RabbitMQ 通信的渠道。信道是建立在 TCP 连接上的虚拟连接,什么意思呢?就是说 rabbitmq 在一条 TCP 上建立成百上千个信道来达到多个线程处理,这个 TCP 被多个线程共享,每个线程对应一个信道,信道在 RabbitMQ 都有唯一的 ID ,保证了信道私有性,对应上唯一的线程使用。
疑问:为什么不建立多个 TCP 连接呢?
原因是 rabbit 保证性能,系统为每个线程开辟一个 TCP 是非常消耗性能,每秒成百上千的建立销毁 TCP会严重消耗系统。所以 rabbitmq 选择建立多个信道(建立在 tcp 的虚拟连接)连接到 rabbit 上。
从技术上讲,这被称之为“多路复用”,对于执行多个任务的多线程或者异步应用程序来说,它非常有用。