RabbitMQ交换机使用场景和消息可靠性总结分析

 更新时间:2023年01月12日 14:50:05   作者:失败的面  
这篇文章主要为大家介绍了RabbitMQ交换机使用场景和消息可靠性总结分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

RabbitMQ的一些基本组件

  • Producer:消息的生产者
  • Consumer:消息的消费者
  • Broker:MQ服务器,管理队列、消息
  • Message:消息,程序间通讯的数据
  • Queue:队列,消息存放的容器,消息先进先出
  • Exchange:交换机,用于分发消息

各种类型交换机的使用场景

扇形交换机(Fanout)

发布/订阅模式,类似于广播,交换机将收到的消息发给多个队列,消费者如果订阅了这个队列的话,就可以收到生产者的消息。生产者不直接与队列绑定,而且将数据发送至交换机Exchange。

扇形交换机不需要路由键,设置了也没有作用。

使用场景

如天气预报信息,生产者将天气预报信息发送到交换机,网易、新浪等门户通过各自队列绑定到该交换机,来获取推送的消息。

扇形交换机发布一次可以让所有消费者收到,但有时候我们需要进行一些数据集筛选,比如我只想接收关于广东省的天气预报,其他省份的忽略,那么我们就需要用到路由或者主题交换机模式。

直连交换机(Direct)

路由模式,通过路由键进行匹配,Exchange交换机会根据路由键(RoutingKey)有条件的将数据筛选后发送给队列

使用场景

日志收集系统,收集了info、warn、error三种类型日志,要发送给对应的队列做处理,如info队列做记录,warn和error队列在info队列基础上还要发送邮件给运维人员,那么可以创建一个直连交换机(Direct),然后绑定三个路由键:INFO、WARN、ERROR到三个队列。

路由模式是一种精准匹配,只有设置了RoutingKey才可以分发消息,在实际应用中可能会有一些模糊匹配的情况,这时候我们可以用主题交换机来实现。

主题交换机(Topic)

在路由模式上增加了通配符,可以进行路由键的模糊匹配,更加灵活的进行消息分发

通配符:*和#,*代表单个关键字,#代表多个关键字

在实际使用场景中,路由模式的效率高于主题模式,所以可以使用路由模式的时候优先使用路由模式。

关于延时队列

在Rabbit MQ中实现延时队列有两种方式:

使用官方提供的延时插件

具体操作可以看我的这篇文章:docker-compose安装RabbitMQ及插件

注意:这个插件的使用还是有一定的限制性,官方说:

Current design of this plugin doesn't really fit scenarios with a high number of delayed messages (e.g. 100s of thousands or millions). See #72 for details.

这个插件目前的设计并不适合有大量延迟消息的场景(例如10万或数百万)。详见第72条。

所以在大消息场景下可以改用Kafka来实现。

通过死信队列来实现

如订单超时功能,创建两个交换机队列,一个订单超时消息,一个订单消息,订单超时消息不设置消费者,仅设置过期时间,这样在到期后会转发给一个交换机Exchange(我们设置为订单消息交换机),订单队列收到这个转发就会发送消息,由此曲线救国的来做到延时消息。

但是死信队列有个大问题:当往队列放入一条过期时间是10秒的A消息,再放入一条过期时间是5秒的B消息,等待5秒后B消息并不会优先进入死信队列被消费,而是遵循队列先进先出规则,在10秒后A消息过期,A和B一起进入死信队列被消费。

不过这个问题也好解决,就是固定这个死信队列的延时时间就好了,比如订单15分钟后超时,就全部订单都是15分钟后超时,不要有A订单10分钟超时,B订单5分钟超时的情况,

消息监听

通过监听消息,我们可以实现消息的确认,是一种实现消息可靠性的方案。

如何保证消息不重复消费

  • 接口 做防重和幂等性保证
  • 保存唯一索引到Redis中,设置一个短一点的过期时间,消费消息前判断缓存中是否有数据,有就说明刚刚已经处理过了,这是一条重复消费

消息可靠性如何保证

  • 生产者提供消息给消费者时使用消息确认机制
  • 消息服务器的队列、交换机都进行持久化,保证数据不丢失

在消息可靠性上,没有方法可以保证完全绝对的可靠,所以必要的日志收集一定要做好,实时监控,在运维上也要下一些功夫。

参考资料

RabbitMQ六种工作模式与应用场景

以上就是RabbitMQ交换机使用场景和消息可靠性总结分析的详细内容,更多关于RabbitMQ交换机消息可靠性的资料请关注脚本之家其它相关文章!

相关文章

  • 基于Java8 Stream API实现数据抽取收集

    基于Java8 Stream API实现数据抽取收集

    这篇文章主要介绍了基于Java8 Stream API实现数据抽取收集,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java 普通代码块静态代码块执行顺序(实例讲解)

    Java 普通代码块静态代码块执行顺序(实例讲解)

    下面小编就为大家带来一篇Java 普通代码块静态代码块执行顺序(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • SpringBoot单元测试框架Mockito介绍及使用

    SpringBoot单元测试框架Mockito介绍及使用

    与集成测试将系统作为一个整体测试不同,单元测试更应该专注于某个类。所以当被测试类与外部类有依赖的时候,尤其是与数据库相关的这种费时且有状态的类,很难做单元测试。但好在可以通过“Mockito”这种仿真框架来模拟这些比较费时的类,从而专注于测试某个类内部的逻辑
    2023-01-01
  • Java编程中正则表达式的用法总结

    Java编程中正则表达式的用法总结

    这篇文章主要介绍了Java编程中正则表达式的用法总结,正则表达式是一种强大的字符串处理工具,Java对正则表达式的支持还是很不错的,我们先来整理一下正则表达式的一些基础知识:
    2016-05-05
  • 详细学习Java Cookie技术(用户登录、浏览、访问权限)

    详细学习Java Cookie技术(用户登录、浏览、访问权限)

    这篇文章主要为大家详细介绍了Java Cookie技术,显示用户上次登录的时间、显示用户最近浏览的若干个图片(按比例缩放)等,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Java并发编程之线程安全性

    Java并发编程之线程安全性

    这篇文章主要介绍了Java并发编程之线程安全性,文章基于Java的相关内容详细的展开详细介绍,需要的小伙伴可以参考一下
    2022-04-04
  • Java设计模块系列之书店管理系统单机版(三)

    Java设计模块系列之书店管理系统单机版(三)

    这篇文章主要为大家详细介绍了Java单机版的书店管理系统设计模块和思想第三章,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 使用MyBatis拦截器实现sql查询权限动态修改代码实例

    使用MyBatis拦截器实现sql查询权限动态修改代码实例

    这篇文章主要介绍了使用MyBatis拦截器实现sql查询权限动态修改代码实例,为了不耦合,现在的方案是在需要鉴权的Mybatis Mapper方法上增加一个注解,在运行过程中判断该注解存在即对sql进行修改,需要的朋友可以参考下
    2023-08-08
  • 详细理解JAVA面向对象的封装,继承,多态,抽象

    详细理解JAVA面向对象的封装,继承,多态,抽象

    这篇文章主要介绍了Java基础之面向对象机制(多态、继承)底层实现,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-07-07
  • Spring MVC常用客户端参数接收方式详解

    Spring MVC常用客户端参数接收方式详解

    这篇文章主要介绍了Spring MVC常用客户端参数接收方式详解,文章主要介绍了几种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02

最新评论