RabbitMQ中的Channel和Exchange详解

 更新时间:2023年08月28日 10:13:12   作者:weixin_44463587  
这篇文章主要介绍了RabbitMQ中的Channel和Exchange详解,创建和销毁TCP连接很耗时,打开太多TCP连接,耗操作系统资源,并发量大到一定程度,系统的吞吐量会降低,使用一个connection多channel的方式,可以提升连接的利用率,需要的朋友可以参考下

channel 

有了TCP连接后,还需要channel的原因如下:

  • 创建和销毁TCP连接很耗时;
  • 打开太多TCP连接,耗操作系统资源,并发量大到一定程度,系统的吞吐量会降低;
  • 使用一个connection多channel的方式,可以提升连接的利用率。

因此采用多个channel多路复用一个TCP连接的方式才比较合理

exchange(交换机)

生产者发消息发往交换机,交换机会自己投递消息到绑定的queue队列

1.exchange根据什么规则把消息投递到哪些queue中?

exchange有4种类型

  • direct: 对routing_key进行严格匹配,当消息来到的时候,只有exchange与某queue绑定的routing_key完全匹配才将消息投递到该queue
  • topic: 对routing_key进行通配符模糊匹配,满足条件的queue都能收到消息,这里的routing_key以"."分隔,*匹配一个单词,#匹配多个单词,如果同一个queue满足多个条件不会被投递多次

如果消息的routingkey是quick.orange.rabbit,那么Q1 Q2都会收到这条消息。

如果消息的routingkey是quick.orange.fox,那么Q1会收到这条消息

  • headers: 根据消息体内的headers属性匹配,绑定的时候可以制定键值对。不依赖routing_key匹配。

大致逻辑与direct差不多,只不过不是用的routing_key来匹配

  • fanout: 转发消息到所有绑定队列,不依赖routing_key匹配

在不需要路由的时候,一般是使用的这个类型的exchange。

  1. 发布订阅:两个queue绑定到同一个exchange上,那么同一个消息被发送到exchange后,exchange会把这个消息发给绑定的所有队列,两个消费者,一人消费一个队列,这就在这两个消费者之间达到了发布订阅的效果
  2.  竞争消费:两个消费者消费同一个队列,这就达到了这两个消费者之间的竞争消费效果。

注意,实际上在写代码的时候不显示指定exchange的数据是发送到一个默认的exchange上的。

2.exchange持久化怎么搞?

如果不设置持久化,broker挂了,再重启,这个exchange就不存在了。

在客户端声明exchange的时候有个入参来控制是否持久化

而autoDelete则是,当没有queue绑定的时候是否自动删除这个exchange

3.生产者ACK机制?

事务或者confirm机制:

rabbitmq生产者确保消息一定送达

这个需要借助Server和MQ的交互实现(tx-select/commit, ok/fail)

4.投递方法

basicPublish中的mandatory和immediate mandatory

当mandatory标志位设置为true时如果exchange根据自身类型和消息routeKey无法找到一个符合条件的queue,那么会调用basic.return方法将消息返回给生产者

(Basic.Return + Content-Header + Content-Body);

当mandatory设置为false时,出现上述情形broker会直接将消息扔掉。

immediate 当immediate标志位设置为true时,如果exchange在将消息路由到queue(s)时发现对于的queue上没有消费者,那么这条消息不会放入队列中。

当与消息routeKey关联的所有queue(一个或者多个)都没有消费者时,该消息会通过basic.return方法返还给生产者。

换句话说,无法找到一个消费者时,消息返还给生产者

到此这篇关于RabbitMQ中的Channel和Exchange详解的文章就介绍到这了,更多相关RabbitMQ的Channel和Exchange内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java equals和=,==的区别详细介绍

    java equals和=,==的区别详细介绍

    这篇文章主要介绍了java equals和=,==的区别,学习Java的朋友对equals 和== 这个概念开始使用的时候会有疑问,很难辨别如何正确使用,这里帮大家详细讲解该知识点,希望大家能掌握,有需要的小伙伴可以参考下
    2016-10-10
  • Gauva使用ListenableFuture介绍说明

    Gauva使用ListenableFuture介绍说明

    并发是一个困难问题,但是通过强大和强大的抽象能够显著的简化工作。为了简化问题,Gauva使用ListenableFuture扩展了JDK的Future接口,这篇文章主要介绍了Gauva使用ListenableFuture
    2023-01-01
  • Spring HandlerInterceptor实现原理代码解析

    Spring HandlerInterceptor实现原理代码解析

    这篇文章主要介绍了Spring HandlerInterceptor实现原理代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 解决springboot application.yml变灰色的问题

    解决springboot application.yml变灰色的问题

    这篇文章主要介绍了解决springboot application.yml变灰色的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • java Unicode和UTF-8之间转换实例

    java Unicode和UTF-8之间转换实例

    这篇文章主要介绍了java Unicode和UTF-8之间转换实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Centos中yum方式安装java的实现示例

    Centos中yum方式安装java的实现示例

    这篇文章主要介绍了Centos中yum方式安装java的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • MybatisPlus代码生成器的使用方法详解

    MybatisPlus代码生成器的使用方法详解

    在这里我将展示如何自动生成实体类、控制层、服务层、mapper等代码,这些基础的代码全部不需要我们手动创建,由MybatisPlus自动帮我们完成,我们只需要告诉MybatisPlus怎么生成这些代码就可以了,在此之前我们需要配置好测试的环境,数据库和表数据 ,需要的朋友可以参考下
    2021-06-06
  • 解决Java变异出现错误No enclosing instance of type XXX is accessible

    解决Java变异出现错误No enclosing instance of type XXX is accessible

    这牌你文章主要给大家分享解决Java变异出现错误,具体的饥饿绝方案请看下面文章的内容,需要的朋友可以参考一下,希望能帮助到你
    2021-09-09
  • Spring Boot的几种统一处理方式梳理小结

    Spring Boot的几种统一处理方式梳理小结

    这篇文章主要为大家介绍了Spring Boot的几种统一处理方式梳理小结,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 详解Java设计模式之外观模式

    详解Java设计模式之外观模式

    在Java开发中,设计模式是一种十分常见的编程思想,它可以帮助我们解决很多实际开发中的问题,本篇文章将介绍一种常见的设计模式——外观模式,并结合实际的开发场景进行讲解,需要的朋友可以参考下
    2023-06-06

最新评论