首页 > 其他分享 >消息补偿。

消息补偿。

时间:2024-09-06 09:51:02浏览次数:6  
标签:Q3 Q2 生产者 投递 补偿 消息 监听

消息可靠性保障

消息补偿机制

image-20210817140336667

步骤:

如果正常情况,生产者投递消息到队列,消费者监听队列消费,那就万事大吉,但是有很多不可控原因,网络波动,程序异常,等等,导致不是每次都正常投递消费,所以我们要做到消息可靠投递消费,采用消息补偿机制

  1. 生产者将数据写入到本地数据库
  2. 生产者投递消息到消息队列 Q1
  3. 过段时候生产者再次发送消息到队列 Q2,与第②步投递的消息相同
  4. 消费者监听队列 Q1,消费
  5. 消费者将消息写入到消费者的本地数据库
  6. 消费者将消息投递到另外一个队列 Q3
  7. 一个独立的回调检查服务会监听队列 Q3,监听 Q3 [消费者投递的消息] 里的消息,如果消费者正常消费,那么Q3肯定会有该消息
  8. 将监听的 Q3 的消息写入到回调检查的本地数据库
  9. 回调检查服务监听 Q2 [生产者延迟投递的消息]
  10. 将监听的 Q2 的消息写入到本地数据库,由于第⑧步已经写入过一次,所以肯定会主键冲突(一般消息都携带唯一主键),说明成功
  11. 如果 Q2 写入成功,说明第 8 步监听Q3 没有该消息,说明消息消费失败,通知生产者再次投递该消息

仍然有其他的问题:

  1. 假设第 2 步,第 3 步都投递失败,Q1 ,Q2 里都没有该消息,消费者不会消费,回调检查服务监听 Q2 也没有消息
    • 采用独立的定时检查服务,查看生产者的数据库与回调检查的数据库数据是否一致。如果回调检查的数据库数据少于生产者数据库,定时检查服务通知生产者投递
  2. 假设第④⑤⑥步网络波动,导致消费者消费完,过了很久10分钟才投递到 Q3,而第③步只延迟了5分钟,回调检查服务监听 Q2 Q3,当第5分钟的时候,发现 Q2 里有消息,就进行第⑩步,数据检查,发现回调服务的数据库里写入成功,以为消费者消费失败,通知了生产者重发,而生产者又发送了一条一样的消息。消费者有可能重复消费。
    产者重发,而生产者又发送了一条一样的消息。消费者有可能重复消费。
    • 幂等性保障

标签:Q3,Q2,生产者,投递,补偿,消息,监听
From: https://blog.csdn.net/Wen_J_Q/article/details/141932200

相关文章

  • freeRTOS面试题目 面经 单片机面经汇总MCU RTOS常见面试经验汇总 freeRTOS消息队列 信
    常见rtos部分Linux题目汇总FreeRtos面经30题前后台程序与实时操作系统的区别是什么?实时系统的基本特性有哪些?什么是不可剥夺型内核?它的特点是什么?可剥夺型内核的定义及适用场景是什么?什么是可重入型函数?它有什么特点?使用可剥夺型内核时,为什么不应直接使用不可重入型函数......
  • 常见概念 -- DCM色散补偿
    色散的概念光是一种电磁波,在特定介质中,光的相速度随频率(波长)或传输模式有差异,造成光波在通过介质后,不同频率成分光波的相位形成分散或分离的效果,称为色散。日常生活中,最广为人知的色散现象是白光(复合光)通过三棱镜后形成彩色光带(光谱)的效果。在光纤传输中也存在色散效应......
  • 低压配电系统中的无功补偿设备——智能电力电容器
    摘要:智能电力电容器是低压配电系统中用于节能、降低线损、提高功率因数和电能质量的新一代无功补偿设备。它由智能测控单元、投切开关、线路保护单元、低压电力电容器等构成,改变了传统无功补偿装置体积庞大和笨重的结构模式,适应了现代电网对无功补偿的更高要求。关键词:智能电......
  • 一个简单API,一键实现多通道消息推送
    Spug推送助手是一个强大的多通道消息推送平台,支持电话、短信、邮件、飞书、钉钉、微信、企业微信等多种推送方式。只需一个简单的API调用,即可实现消息的快速分发。如何使用?使用推送助手非常简单,一个curl命令即可搞定:curlhttps://push.spug.cc/send/LQjEKrl?code=688522......
  • 一个故事理解消息队列-下
    这是一篇迟到一月有余的文章。在7月18号,我用了一个故事作为案例,介绍了消息队列的基本功能和应用场景。本打算第二天介绍消息队列的主要功能特性的,由于文章排期等其他因素影响,故更新搁置了。这篇文章,接上篇《一个故事理解消息队列-上》,以Kafka为例,为大家介绍消息队列的主要功能......
  • 【Qt】消息对话框 QMessageBox
    消息对话框QMessageBoxQMessageBox用于显示一个消息给用户,,并且让用户进行一个简单的选择。消息对话框是应⽤程序中最常⽤的界⾯元素。消息对话框主要⽤于为⽤⼾提⽰重要信息,强制⽤⼾进⾏选择操作。例子:创建一个消息对话框(1)在QtDesigner中设置一个按钮(2)右键点击......
  • 【大数据】Kafka与RocketMQ:消息队列界的“绝代双骄”
    文章目录一、开场白:消息队列江湖的“风云际会”二、正文1.Kafka与RocketMQ的由来:两颗璀璨的明星2.发展历程:各自的成长轨迹3.区别:各有千秋,各领风骚4.使用场景:谁的主场,谁的地盘?5.如何选择:挑花了眼怎么办?6.市场占用情况:谁更受欢迎?三、结尾:携手共创,消息队列的未来......
  • Java中用于格式化文本消息的工具类MessageFormat.format,使用{x}占位符
    MessageFormat.format 是Java中用于格式化文本消息的工具类。它允许你定义一个模板字符串,并使用一组参数来填充模板中的占位符。这个类是用于处理复杂消息格式的,例如多语言环境下的消息。MessageFormat.format 的使用方式如下:publicstaticStringformat(Stringpattern,......
  • 进程间通信——消息队列(通俗易懂)
    消息队列概念消息队列是消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺陷。消息队列包括POSIX消息队列和SystemV消息队列。消息队列是UNIX下不同进程之间实现共享资源的一种机制,UNIX......
  • 进程间通信(信号灯集、消息队列)
    1.信号灯集线程:全局变量,同步通过信号量初始化:sem_init(&sem,0,0);申请资源:sem_wait(&sem);P操作,-1释放资源:sem_post(&sem);V操作,+11.1特点信号灯(semaphore),也叫信号量,信号灯集是一个信号灯的集合。它是不同进程间或一个给定进程内部不同线程间同步的机制;而Posi......