消息丢失可能发生在生产者发送消息、MQ本身丢失消息、消费者丢失消息3个方面。

生产者丢失

生产者丢失消息的可能点在于程序发送失败抛异常了没有重试处理,或者发送的过程成功但是过程中网络闪断MQ没收到,消息就丢失了。

由于同步发送的一般不会出现这样使用方式,所以我们就不考虑同步发送的问题,我们基于异步发送的场景来说。

异步发送分为两个方式:异步有回调和异步无回调,无回调的方式,生产者发送完后不管结果可能就会造成消息丢失,而通过异步发送+回调通知+本地消息表的形式我们就可以做出一个解决方案。以下单的场景举例。

1、下单后先保存本地数据和MQ消息表,这时候消息的状态是发送中,如果本地事务失败,那么下单失败,事务回滚。

2、下单成功,直接返回客户端成功,异步发送MQ消息

3、MQ回调通知消息发送结果,对应更新数据库MQ发送状态

4、JOB轮询超过一定时间(时间根据业务配置)还未发送成功的消息去重试

5、在监控平台配置或者JOB程序处理超过一定次数一直发送不成功的消息,告警,人工介入。

一般而言,对于大部分场景来说异步回调的形式就可以了,只有那种需要完全保证不能丢失消息的场景我们做一套完整的解决方案。

MQ丢失

如果生产者保证消息发送到MQ,而MQ收到消息后还在内存中,这时候宕机了又没来得及同步给从节点,就有可能导致消息丢失。

RocketMQ分为同步刷盘和异步刷盘两种方式,默认的是异步刷盘,就有可能导致消息还未刷到硬盘上就丢失了,可以通过设置为同步刷盘的方式来保证消息可靠性,这样即使MQ挂了,恢复的时候也可以从磁盘中去恢复消息。

虽然我们可以通过配置的方式来达到MQ本身高可用的目的,但是都对性能有损耗,怎样配置需要根据业务做出权衡。

消费者丢失

消费者丢失消息的场景:消费者刚收到消息,此时服务器宕机,MQ认为消费者已经消费,不会重复发送消息,消息丢失。

RocketMQ默认是需要消费者回复ack确认,而kafka需要手动开启配置关闭自动offset。

消费方不返回ack确认,重发的机制根据MQ类型的不同发送时间间隔、次数都不尽相同,如果重试超过次数之后会进入死信队列,需要手工来处理了。(Kafka没有这些)

异步发送,那消息可靠性怎么保证?相关推荐

  1. 消息的同步发送,异步发送以及消息发送的可靠性

    最近写的一个通信框架中有两种最基本的消息发送方式:同步发送和异步发送. 同步方式: 消息的发送方发A送一条消息到接收端B,B收到消息之后需要对消息进行处理,然后发送ACK确认消息回A,A收到B的ACK ...

  2. springboot整合rocketMQ记录 实现发送普通消息,延时消息

    一.为什么选择RocketMQ消息队列?(可跳过看三的整合代码实例) 首先RocketMQ是阿里巴巴自研出来的,也已开源.其性能和稳定性从双11就能看出来,借用阿里的一句官方介绍:历年双 11 购物狂 ...

  3. 异步处理需要消息补偿闭环

    使用类似 RabbitMQ.RocketMQ 等 MQ 系统来做消息队列实现异步处理,虽然说消息可 以落地到磁盘保存,即使 MQ 出现问题消息数据也不会丢失,但是异步流程在消息发送. 传输.处理等环节 ...

  4. kafka 同步提交 异步_腾讯游戏工程师分享:简单理解 Kafka 的消息可靠性策略

    作者:hymanzhang,腾讯 IEG 运营开发工程师 背景 部门的开发同学最近在开发一个活动的过程中,需要关注大量的应用后台逻辑,捕捉各种事件的触发.在设计时打算采用 kafka 消息队列进行业务 ...

  5. rabbitmq可靠性投递_解决RabbitMQ消息丢失问题和保证消息可靠性(一)

    工作中经常用到消息中间件来解决系统间的解耦问题或者高并发消峰问题,但是消息的可靠性如何保证一直是个很大的问题,什么情况下消息就不见了?如何防止消息丢失?下面通过这篇文章,我们就聊聊RabbitMQ 消 ...

  6. 【Kafka】消息的同步发送和异步发送

    文章目录 概述 1. sync vs async 1.1 java代码同步和异步 2. 可靠性机制(ack属性配置) 2.1 oneway 3. 一般配置 4. 同步异步和ack的联系和区别 参考 概 ...

  7. Rabbitmq消息保存机制应用案例分析消息可靠性保证

    Rabbitmq 消息保存机制 mandatory参数和immediate参数作用 mandatory:当参数设置为true时,交换器无法根据自身的类型和路由键找到一个符合条件的队列,Rabbitmq ...

  8. RocketMQ如何保证消息不丢失(消息可靠性)

    为什么说ROcketMQ更适用于业务型的消息中间件,因为它能够保证消息不丢失且带有事务消息. 先来看一张RocketMQ集群部署结构 其中Name Server主要是提供路由信息,这里暂时忽略,大致流 ...

  9. RocketMQ的各种集群模式的搭建和消息可靠性保证和服务可用性描述

    RocketMQ集群搭建的特点 NameServer是一个几乎无状态的节点,可直接启动集群部署.节点之间没有任何信息同步,并且集群的NameServer之间都不知道彼此的存在. Broker部署相对复 ...

最新文章

  1. 图片和文件上传的两款插件
  2. 加快windows上对大文件,以及很多很多小文件进行不同磁盘拷贝的速度——windows上的最快拷贝软件FastCopy
  3. linux中pthread_join()与pthread_detach()详解
  4. 再谈 Application ProvidedAar
  5. 百度网盘迎来劲敌!非会员下载速度10MB/S……
  6. mysql 数据修改记录日志_mysql对数据的更新操作记录在哪个日志中?
  7. 作者:单志广(1974-),男,博士,国家信息中心信息化研究部副主任
  8. java基本类型引用类型_Java基本类型和引用类型
  9. Vue-cli proxyTable 解决开发环境的跨域问题
  10. Windows server 2003 伪静态配置方法
  11. Skyline软件二次开发初级——6如何在WEB页面中的三维地图上进行坐标和方向计算...
  12. SQLServer 2016安装时的错误:Polybase要求安装Oracle JRE 7更新51或更高版本
  13. matlab textscan 分块读取,【转】matlab的textscan与textread区别
  14. 阿里小蜜:语音识别、语义分析、深度学习在手机淘宝的实战分享
  15. python中append什么意_python里append是什么
  16. 如何取消文件关联,恢复文件默认的图标,最简单的办法!!!!!
  17. 小学计算机京剧脸谱教案,[热门]《戏曲脸谱》小学美术教学案例
  18. 《C语言程序设计》第4版 何钦铭、颜晖主编 课后习题答案 第5章 习题5
  19. AXI3和AXI4的接口信号区别
  20. mov格式的视频转换mp4,教你三种方法转换

热门文章

  1. 用wubi在一个独立分区硬件装ubuntu12.04产生的无法识别U盘的解决办法
  2. [Umbraco] 创建第一个页面
  3. DLL引用之SQLite在Win32、64下的兼容
  4. Fliptile (二进制压缩)
  5. python-global全局变量
  6. 蓝桥杯-题目:猜算式
  7. 边学习新技术边工作的重要性
  8. [asp.net] 获取网页访问来路的几种方法
  9. 网络摄像头4 cmos 0v9650,driver
  10. 调用WCF返回Josn的两种方式