博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RabbitMQ 中 Connection 和 Channel 详解
阅读量:5997 次
发布时间:2019-06-20

本文共 1164 字,大约阅读时间需要 3 分钟。

我们知道无论是生产者还是消费者,都需要和 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 用于监听多个信道的时间(比如连接打开,数据到达等)。因此,单线程可以监听多个数据的信道。

 

转载于:https://www.cnblogs.com/eleven24/p/10326718.html

你可能感兴趣的文章
马的遍历进阶版--骑士巡游(添加了评估函数)[Teaks & xgluxv & r]
查看>>
给石头的诗
查看>>
T-SQL朝花夕拾(五) 动态T-SQL语句语法
查看>>
CGI编程读书笔记
查看>>
a标签的link、visited、hover、active的顺序
查看>>
OpenExpressApp:实体扩展属性系统 - 设计方案说明书
查看>>
图解Git
查看>>
杨中科 向HtmlAgilityPack道歉:解析HTML还是你好用
查看>>
【three.js练习程序】创建简单物理场景
查看>>
GridView, DataGrid 中,DataFormatString语法汇总
查看>>
静态成员与实例成员
查看>>
简单实用的操作RMS小例子
查看>>
温习 数据结构之HuffmanTree
查看>>
File:/etc/sysconfig/init解析
查看>>
hdu 4619 Warm up 2(并查集)
查看>>
android文件下载大小和网络不一致(偏大)
查看>>
poj 3370 鸽笼原理知识小结
查看>>
linux kernel启动流程
查看>>
Python之控制台输入密码的方法
查看>>
.net下二进制序列化的格式分析[转]
查看>>