`
sz_jack
  • 浏览: 3966 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

RabbitMQ 中 Connection 和 Channel 详解

 
阅读更多

引用原文地址:https://www.cnblogs.com/eleven24/p/10326718.html

 

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

 

分享到:
评论

相关推荐

    rabbitmq-c.tar.gz

    总之,rabbitmq-c库为C语言开发者提供了与RabbitMQ交互的强大工具,通过理解和掌握这个库,我们可以轻松地在C语言项目中实现高效的消息队列通信,从而提升系统的稳定性和扩展性。无论是构建微服务架构,还是优化后台...

    rabbitMQ实战java版-rabbitMQ-demo.zip

    本文将围绕RabbitMQ的Java实践,通过分析"rabbitMQ-demo.zip"中的示例项目"rabbitMQ-demo-main",深入讲解RabbitMQ的核心概念、工作模式以及如何在Java环境中进行集成和应用。 一、RabbitMQ核心概念 1. **Broker**...

    rabbitmq HelloWorld java 代码

    **RabbitMQ HelloWorld Java 代码详解** 在Java开发中,RabbitMQ是一个广泛使用的消息队列系统,它基于AMQP(Advanced Message Queuing Protocol)协议,提供了高效、可靠的异步通信解决方案。本教程将深入讲解如何...

    RabbitMQ运行例子

    **RabbitMQ运行实例详解** RabbitMQ是一个广泛使用的开源消息代理和队列服务器,它基于AMQP(Advanced Message Queuing Protocol)协议,为各种语言提供了丰富的客户端库,包括Java、Python、Ruby、PHP等。在本文中...

    RabbitMQ资料整理

    7. 消费者同样建立Connection和Channel,然后从队列中消费消息。 与Java消息服务(JMS)相比,AMQP是一个更低级别的协议,专注于消息格式和传输,允许不同平台和语言的互操作性。JMS只规范了API,而AMQP规范了整个...

    rabbitmq-access, rabbitmq手动确认模式java封装.zip

    《RabbitMQ手动确认模式与Java封装详解》 在分布式系统中,消息队列作为解耦、异步处理的关键组件,被广泛应用于各种业务场景。RabbitMQ作为一款开源的消息中间件,因其稳定性和易用性深受开发者喜爱。本文将深入...

    rabbitmq-java-client-javadoc-2.7.0.zip

    `Connection`对象代表了与RabbitMQ服务器的会话,可以创建多个`Channel`来执行各种操作。`Channel`是实际进行消息传递的通道,它是线程安全的,可以用于发送和接收消息。 发送消息主要涉及`Channel#basicPublish`...

    RabbitMq安装详细步骤

    ### RabbitMQ 安装与配置详解 #### 一、前言 RabbitMQ 是一个开源的消息代理和队列服务器,实现高级消息队列协议 (AMQP) 0-9-1 规范。它能够存储转发消息,在分布式系统中发送消息给其他应用程序。本文将详细介绍 ...

    RabbitMQ .NET消息队列使用详解

    然后,通过ConnectionFactory创建连接(connection)和通道(channel)。通道是与RabbitMQ服务器通信的实体,所有的AMQP操作都在通道上执行。我们声明一个Direct类型的交换器(Exchange),这种类型的交换器按照精确...

    python rabbitmq

    ### Python与RabbitMQ知识点详解 #### 一、引言 在现代软件开发尤其是分布式系统设计中,消息队列作为实现服务间异步通信的重要工具之一,被广泛应用。其中,RabbitMQ是一款非常流行的消息中间件,支持多种消息...

    rabbitmq(java)入门教程

    通过以上内容,我们可以了解到如何在 Java 中使用 RabbitMQ 实现基本的消息发送和接收。在实际应用中,还需要根据业务需求配置交换器、队列绑定以及消息的确认机制等,以构建更复杂的异步通信和工作流。

    rabbitmq-dotnet-client-3.5.0

    2. 通道操作:在RabbitMQ中,通道(Channel)是实际执行AMQP操作的实体,它是线程安全的。`IModel`接口代表了通道,开发者可以使用`IConnection.CreateModel()`方法创建一个新的通道实例,进行消息的发布和接收。 3...

    rabbitmq-c.rar

    四、rabbitmq-c API详解 rabbitmq-c库提供了丰富的API接口,包括连接管理、通道操作、队列、交换机、绑定等。例如: 1. **连接管理**:`rmq_connection_init()`初始化连接,`rmq_connection_destroy()`关闭连接。 ...

    rabbitMQ java客户端入门

    ### RabbitMQ Java客户端入门知识点详解 #### 一、RabbitMQ概述 - **定义与功能**:RabbitMQ是一款开源消息代理软件,基于Erlang语言开发,支持多种消息协议,如AMQP(Advanced Message Queuing Protocol)。其...

    RabbitMq技术文档

    ### RabbitMQ 技术文档详解 #### 一、RabbitMQ 概述 RabbitMQ 是一款开源的消息中间件,其主要功能在于实现消息的接收、存储与转发。这一过程可类比为现实生活中的邮局服务,即消息的生产者(Producer)负责“寄信...

    RabbitMQ消息中间件示例详解

    RabbitMQ 消息中间件示例详解 RabbitMQ 消息中间件是使用 Erlang 语言开发的高级消息队列协议(Advanced Message Queuing Protocol,AMQP),具有高可靠性和一致性。它可以胜任订单处理、秒杀等一致性要求较高的...

    RabbitMQ 文档

    RabbitMQ的核心功能在于能够高效地在分布式系统中存储和转发消息,实现系统组件间的解耦。 #### 二、AMQP协议特性 AMQP协议作为RabbitMQ的基础,具有以下关键特性: 1. **面向消息**:AMQP协议关注的是消息本身,...

    rabbitmq-java-client-bin-3.3.4

    2. **通道(Channel)**:在RabbitMQ中,所有的操作都是通过通道进行的,它是一种轻量级的连接,降低了频繁打开和关闭连接的开销。通过Channel对象,可以进行声明交换器(Exchange)、队列(Queue)以及绑定...

    JAVA获取rabbitmq消息总数过程详解

    2. **创建连接和通道**: 使用`ConnectionFactory`创建一个新的连接`Connection`,然后在这个连接上创建一个通道`Channel`。通道是与RabbitMQ服务器进行通信的主要接口。 ```java Connection connection = factory....

    rabbitMq加erlang

    **RabbitMQ与Erlang详解** RabbitMQ是一个开源的消息代理和队列服务器,它基于AMQP(Advanced Message Queuing Protocol)协议实现,广泛应用于分布式系统中的消息传递。RabbitMQ的核心是其高可用性、可靠性和可...

Global site tag (gtag.js) - Google Analytics