首页 > 其他分享 >RabbitMq的实践中解决过消息丢失、消息幂等性、消息顺序消费、消息延迟消费等问题;

RabbitMq的实践中解决过消息丢失、消息幂等性、消息顺序消费、消息延迟消费等问题;

时间:2024-02-22 09:35:30浏览次数:29  
标签:消费 队列 RabbitMq queue 交换机 消息

1、RabbitMq如何实现消息延迟消费?

1.1、延时插件

  答:延时插件 rabbitmq_delayed_message_exchange,下载好之后放到对应plugins目录下,然后启用插件声明交换器类型为 x-delayed-message 来标示此交换机为延时交换机,发送消息时在 header 中添加 x-delay 参数来控制消息的延时时间

1.2、死信队列

  英文缩写DLX,Dead Letter Exchange(死信交换机),当消息成为Dead message(消息过期)后,可以被重新发送到另一个交换机,这个交换机就算是DLX,其实死信交换机(队列)和正常交换机(队列)没有什么区别

1.3、什么情况下消息成为死信队列,消息成为死信队列的三种情况


  1.3.1 队列消息长度达到限制
    比如说给队列最大存储长度为10,当11条消息进来的时候,第11条消息进不去了,那么第11条消息就是死信

  1.3.2 消费者拒绝消费消息,basicNack/basicReject,并且不把消息重新放入原目标队列,requeue=false,
    消费者使用basicNack/basicReject,并且requeue=false,表示消费者拒绝重新消费该消息

  1.3.3 原队列存在消息过期设置,消息到达超时时间未被消费
    原来的队列存在过期时间,但是到了过期时间还没有消费该消息

2、RabbitMq如何保证消息不丢失?

  生产者端:
    1、开启事务(会导致吞吐量下降,太消耗性能)【同步】
    2、开启confirm模式【异步】

  RabbitMq服务端:
    交换机、队列和消息全部设置持久化,当我们MQ挂了之后重启,会从磁盘上恢复queue,恢复队列里的消息

  消费者端:
    关闭自动ACK(消费者收到消息就会自动ACK,可能还没有来得及消费),使用手动ACK(可能存在消费了,没来的及ACK,出现消息再次投递,多次消费情况)

3、产品重复消费原因

  生成者端:
    因网络延迟、超时、RabbitMq服务端宕机、未能正常收到RabbitMq服务端的成功响应值,导致消息重试多次发送

  消费者端:
    和生产者一样,消费者消费了消息,因网络原因,宕机、超时等原因,不能及时返回给RabbitMq服务端成功响应值,导致消息重试多次发送

4、RabbitMq如何保证消息幂等性?

  无论是写入数据库还是写入缓存Redis,给其增加一个唯一主键(唯一key),对于数据库可以判断是否存在该主键,存在则说明消费过。
  对于Redis,的setnx操作就是天然的幂等性,可以根据返回值进行判断

5、RabbitMq如何保证消息顺序性?

  核心思路就是根据业务数据关键值划分成多个消息集合,而且每个消息集合中的消息数据都是有序的,每个消息集合有自己独立的一个consumer。多个消息集合的存在保证了消息消费的效率,每个有序的消息集合对应单个的consumer,也保证了消息消费时的有序性。

  queue里面的消息一定是有序的,只有一个消费者消费queue中的消息,是不会出现消息错乱的。但多个消费者消费同一个queue就会出现消费错乱。

  5.1、一个queue存在多个consumer,不能保证消费者的消费时间顺序,这样也会造成消息消费顺序错误

    将原来的一个queue拆分成多个queue,每个queue都有一个自己的consumer(该种方案的核心是生产者在投递消息的时候根据业务数据关键值(例如订单ID哈希值对订单队列数取模)来将需要保证先后顺序的同一类数据(同一个订单的数据) 发送到同一个queue当中)

  5.2、一个queue对应一个consumer,但是consumer里面进行了多线程消费,这样也会造成消息消费顺序错误

    在consumer中维护多个内存队列,根据业务数据关键值(例如订单ID哈希值对内存队列数取模)将消息加入到不同的内存队列中,然后多个真正负责处理消息的线程去各自对应的内存队列当中获取消息进行消费。  

标签:消费,队列,RabbitMq,queue,交换机,消息
From: https://www.cnblogs.com/karrya/p/18026615

相关文章

  • Rabbitmq 消息队列介绍
    Rabbitmq搭建和使用1.消息队列介绍1.1消息队列模式消息队列目前主要2种模式,分别为“点对点模式”和“发布/订阅模式”。1.1.1点对点模式一个具体的消息只能由一个消费者消费,多个生产者可以向同一个消息队列发送消息,但是一个消息在被一个消息者处理的时候,这个消息在队列......
  • 【微信/企业微信】批量发送消息
    一、背景公司运营需求,会经常给一些用户发送具有针对性的消息,用来提高用户黏性。之前每次发送都是人工处理,编辑信息,然后一个一个的手动复制粘贴发送,整个过程枯燥无味,浪费了大量的时间精力。一次偶然机会发现有现成的RPA工具,专门用来处理这种重复且规律的工作。自己下了一个,花了半......
  • 【专题】2024中国消费电子和家电行业趋势报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=35177原文出处:拓端数据部落公众号中国是全球消费电子和家用电器的重要制造基地和出口国,占据全球市场超过22%的销售份额。在亚太市场销量方面也占据重要地位。作为“世界工厂”,中国拥有庞大的电子制造和出口能力,涵盖智能手机、电脑、电视、消费类电......
  • Winform创建仅接收消息的窗口
    internalclassMessageOnlyWindow:NativeWindow{privateconststringWindowName="MessageOnlyWindow";publicLowLevelView(){varcreateParams=newCreateParams{Style=0,ExStyle=0,......
  • kafka消费组和分区关系详解
    原文链接:https://blog.csdn.net/weixin_42324471/article/details/121985212消费组概念:ConsumerGroup是Kafka提供的可扩展且有容错性的消费者机制。一个组里面有多个消费者实例,这些消费者共享一个ID,称为GroupID。组内的所有消费者协调在一起来消费订阅主题(SubscribedTopics......
  • fastDFS:fdfs_monitor:last_heart_beat_time 字段的信息来自最后访问的tracker server的
    命令:fdfs_monitor/etc/fdfs/client.conf2>/dev/null|grep-vE'succ|out_'|grep-E'tracker|Stora|Group|heart|sync|time|id|ip|upload'结果: 说明:    last_heart_beat_time的指的是storageserver与trackerserver心跳通讯,收到的trackerserver的心......
  • 美团面试:Kafka如何处理百万级消息队列?
    美团面试:Kafka如何处理百万级消息队列?在今天的大数据时代,处理海量数据已成为各行各业的标配。特别是在消息队列领域,ApacheKafka作为一个分布式流处理平台,因其高吞吐量、可扩展性、容错性以及低延迟的特性而广受欢迎。但当面对真正的百万级甚至更高量级的消息处理时,如何有效地利......
  • RabbitMQ 学习笔记 - 2
    WorkQueues工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。3.1......
  • 启动和停止RabbitMQ
    以下是在Ubuntu上启动和停止RabbitMQ的完整命令:启动RabbitMQ打开终端并输入以下命令以启动RabbitMQ服务:sudosystemctlstartrabbitmq-server检查RabbitMQ服务是否正在运行:sudosystemctlstatusrabbitmq-server如果RabbitMQ服务正在运行,您应该看到“active(runni......
  • Rabbitmq
    Rabbitmq官网:https://rabbitmq.com/install-homebrew.html安装brewinstallrabbitmq#查看版本信息,及安装位置brewinforabbitmq#配置环境变量open-e~/.zshrc#添加如下内容exportPATH=/opt/homebrew/Cellar/rabbitmq/3.12.13/sbin:$PATHrabbitmq命令#启动服......