MQ面试题

题目1: MQ会丢失消息吗,怎么保证不丢消息

1、哪些环节会有丢消息的可能?
在这里插入图片描述

其中,1,2,4三个场景都是跨网络的,而跨网络就肯定会有丢消息的可能。
然后关于3这个环节,通常MQ存盘时都会先写入操作系统的缓存page cache中,然后再由操作系统异步的将消息写入硬盘。这个中间有个时间差,就可能会造成消息丢失。如果服务挂了,缓存中还没有来 得及写入硬盘的消息就会丢失。

2、RocketMQ消息零丢失方案
1》 生产者使用事务消息机制保证消息零丢失
1、为什么要发送个half消息?有什么用?
这个half消息是在订单系统进行下单操作前发送,并且对下游服务的消费者是不可见的。那这个消息的 作用更多的体现在确认RocketMQ的服务是否正常。相当于嗅探下RocketMQ服务是否正常。

2.half消息如果写入失败了怎么办?
如果没有half消息这个流程,那我们通常是会在订单系统中先完成下单,再发送消息给MQ。这时候写 入消息到MQ如果失败就会非常尴尬了。而half消息如果写入失败,我们就可以认为MQ的服务是有问题的,这时,就不能通知下游服务了。我们可以在下单时给订单一个状态标记,然后等待MQ服务正常后 再进行补偿操作,等MQ服务正常后重新下单通知下游服务。

3.订单系统写数据库失败了怎么办?
这个问题我们同样比较下没有使用事务消息机制时会怎么办?如果没有使用事务消息,我们只能判断下 单失败,抛出了异常,那就不往MQ发消息了,这样至少保证不会对下游服务进行错误的通知。但是这 样的话,如果过一段时间数据库恢复过来了,这个消息就无法再次发送了。当然,也可以设计另外的补 偿机制,例如将订单数据缓存起来,再启动一个线程定时尝试往数据库写。

而如果使用事务消息机制, 就可以有一种更优雅的方案。
如果下单时,写数据库失败(可能是数据库崩了,需要等一段时间才能恢复)。那我们可以另外找个地方 把订单消息先缓存起来(Redis、文本或者其他方式),然后给RocketMQ返回一个UNKNOWN状态。这样 RocketMQ就会过一段时间来回查事务状态。我们就可以在回查事务状态时再尝试把订单数据写入数据库,如果数据库这时候已经恢复了,那就能完整正常的下单,再继续后面的业务。这样这个订单的消息 就不会因为数据库临时崩了而丢失。

4.half消息写入成功后RocketMQ挂了怎么办?
我们需要注意下,在事务消息的处理机制中,未知状态的事务状态回查是由RocketMQ的Broker主动发起的。也就是说如果出现了这种情况,那RocketMQ就不会回调到事务消息中回查事务状态的服务。这时,我们就可以将订单一直标记为"新下单"的状态。而等RocketMQ恢复后,只要存储的消息没有丢失,RocketMQ就会再次继续状态回查的流程。

5.下单成功后如何优雅的等待支付成功?
在订单场景下,通常会要求下单完成后,客户在一定时间内,例如10分钟,内完成订单支付,支付完成 后才会通知下游服务进行进一步的营销补偿。
如果不用事务消息,那通常会怎么办?
简单的方式是启动一个定时任务,每隔一段时间扫描订单表,比对未支付的订单的下单时间,将超过 时间的订单回收。这种方式显然是有很大问题的,需要定时扫描很庞大的一个订单信息,这对系统是个 不小的压力。
那更进一步的方案是什么呢?是不是就可以使

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,下面是MQ(消息队列)面试中经常会遇到的6个经典问: 1. 什么是消息队列(MQ)? 消息队列是一种常用的中间件技术,用于在不同的应用程序之间传递消息。它将消息发送到队列中,然后接收者从队列中接收消息,实现了应用程序之间的解耦。 2. MQ的优点是什么? MQ具有以下几个优点: - 异步通信:发送方发送消息后即可继续处理其他任务,接收方可以在合适的时候处理消息。 - 解耦合:发送方和接收方之间通过消息队列进行通信,彼此不需要直接知道对方的存在,实现了解耦合。 - 削峰填谷:可以通过消息队列平滑处理系统的峰值流量,保证系统的稳定性。 - 可靠性:消息队列通常具备高可靠性和持久化特性,可以确保消息不丢失。 3. RabbitMQ和Kafka有什么区别? RabbitMQ和Kafka是两种常见的消息队列系统,它们有以下区别: - RabbitMQ是一个传统的消息队列系统,采用AMQP协议,支持多种消息模式。适用于实时性要求较高、强一致性的场景。 - Kafka是一个高吞吐量、分布式的日志处理平台,采用发布-订阅模式。适用于大数据量、高并发的场景。 4. 如何保证MQ的高可用性? 保证MQ高可用性的方法主要有以下几种: - 集群部署:通过在多个节点上部署MQ实例,实现故障转移和负载均衡。 - 数据复制:将数据进行复制到多个节点上,确保数据的备份和容灾能力。 - 心跳机制:定期发送心跳检测消息,检测MQ节点的可用性。 - 监控和报警:监控MQ集群的运行状态,及时发现并解决问。 5. 如何确保MQ的消息不丢失? 确保MQ消息不丢失的方法主要有以下几种: - 持久化:将消息存储到磁盘上,即使MQ节点宕机也能够恢复。 - ACK机制:发送方在发送消息后等待接收方的确认消息(ACK),确保消息被正确接收。 - 消息重试:当发送方发送消息失败时,可以进行重试操作,直到成功为止。 6. 如何保证MQ的顺序性? 保证MQ消息顺序性的方法主要有以下几种: - 单一消费者:每个队列只有一个消费者,确保消息按照顺序被处理。 - 分区顺序:将消息按照某个字段进行分区,同一分区内的消息按顺序处理。 - 消费者缓存:消费者接收到消息后缓存起来,按照顺序处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值