面试常考的问题:如何保证消息不丢失

简介: 使用MQ的目的:对系统进行解耦,流量控制(高可用和高性能问题)

案例背景

电商平台上,用户购买商品时会选择使用积分抵扣一部分的金额,在整个过程中,交易服务和积分服务是通过MQ消息队列进行通信的。下单时,交易服务发送扣减积分的消息给MQ队列,而积分服务则在消费端消费这条命令,实现真正扣减操作。

思路分析

使用MQ的目的:对系统进行解耦,流量控制(高可用和高性能问题)

  • 系统解耦

    • 用MQ消息队列,可以隔离系统上下游环境变化带来的不稳定因素。比如,积分服务无论如何变化,交易服务都不受影响,即便积分服务出现故障,主交易流程也可以将积分服务降级,实现2个服务之间的解耦,实现系统高可用
  • 流量控制

    • 高峰期交易时流量突增的场景,通过MQ实现流量的削峰填谷作用,可以下游服务处理能力自动调节流量

解题思路

解决消息丢失需要知道哪些环节会丢失消息。而整个过程涉及生产者,消费者,消息中间件。

image-20210810234409277

生产者:消息在发送给MQ时,若出现网络问题,或者业务bug问题可能会导致消息无法发送成功。所以需要处理好返回值和异常,防止消息无法正常发送给MQ,必要时可增加报警机制,监控未成功发送的数据,提醒开发人员进行人工干预或自动重发机制。

消息中间件:由消息中间件来保证

消费者:消费者从Broker上拉取消息,只要消费服务完成业务处理,再发送消费成功确认,就能保证消息不丢失。

整个过程,从生产者发送消息,到消费者获取到消息,并完成业务处理,最后发送消费完成确认,就可以保证万无一失。但是对于Design for Failure的设计原则,我们应该增加一个消息检测来检查消息是否丢失。即在消息生产者,发出消息时同时携带全局唯一ID或者连续递增版本号,然后消费者对对应的版本做校验。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
6月前
|
消息中间件 存储 缓存
【面试问题】MQ 如何保证消息的顺序性?
【1月更文挑战第27天】【面试问题】MQ 如何保证消息的顺序性?
|
消息中间件 Kafka 程序员
美团面试真题,如何保证Kafka消息不丢失?
一位工作了5年的小伙伴去美团面试以后,跟我反馈说,被问到一个“如何保证Kafka消息不丢失?”的问题,不知道如何回答。其实,这道题真的很基础。 很多小伙伴可能只会回答说,消息要持久化,添加消息确认机制。如果,你只是这样回答,那就和普通的程序员没什么区别。要想让面试官感觉你确实有不一样的理解,就应该从多个方面更全面地来分析和回答这个问题。今天,我来给大家讲明白。
132 0
|
设计模式 安全 前端开发
面试官:Spring MVC 如何保证 Controller 的并发安全性?面试必问。。
单例模式(Singleton)是程序设计中一种非常重要的设计模式,设计模式也是Java面试重点考察的一个方面。
325 0
面试官:Spring MVC 如何保证 Controller 的并发安全性?面试必问。。
|
SQL 安全 关系型数据库
面试高频:MySQL是如何保证主从库数据一致性的?
大家好,我是Leo。前面文章我们介绍了WAL的安全机制。可以保证数据的安全性。通过安全性我们分析了binlog,redolog日志的写入机制。今天我们分析一下主从库的实现原理!MySQL是如何保证主从库的数据是一致的呢?
面试高频:MySQL是如何保证主从库数据一致性的?
|
消息中间件 NoSQL JavaScript
面试必问,如何保证接口的幂等性?
我们都知道面试的时候,什么问题,都会有,这个全看面试官想问什么,但是有一些比较专业的术语,可能对于小白来说,就不是很好,一个学妹,面试的时候,就被问到了一个问题,接口的幂等性,你们是怎么保证的?这个问题,学妹可能不知道幂等性是个什么概念,所以,也就没有办法精准的定位,把面试官想要的答案说出来,今天就来说说如何保证接口的幂等性。
面试必问,如何保证接口的幂等性?
|
设计模式 存储 缓存
面试必问的缓存使用:如何保证数据一致性、缓存设计模式
缓存使用在现在的项目中非常常见,缓存在为我们带来便利的同时,也会带来一些常见的问题,如果不谨慎使用,可能会带来意想不到的结果。
542 0
面试必问的缓存使用:如何保证数据一致性、缓存设计模式
|
消息中间件 存储 SQL
消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?(下)
消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?(下)
消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?(下)
|
消息中间件 存储 运维
消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?(上)
消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?(上)
消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?(上)
|
消息中间件 Java 关系型数据库
突破Java面试(9)-如何保证消息队列的顺序性
突破Java面试(9)-如何保证消息队列的顺序性
221 0
突破Java面试(9)-如何保证消息队列的顺序性
|
消息中间件 Kafka
突破Java面试(06)-如何保证消息队列的高可用性
高可用是必问的,因为MQ的缺点很多,导致系统可用性降低。 所以只要你用了MQ,接下来问的一些要点肯定就是围绕着MQ的那些缺点怎么解决. 要是你傻乎乎的就干用了一个MQ,各种问题从来没考虑过,那你就杯具了,面试官对你的印象就是,只会简单实用一些技术,没任何思考,马上对你的印象就不太好了。
5446 0