2025.2.24学习
2025.2.24学习
今天周一,复习一下上周学的mysql,redis,rocketMQ
rocketMQ
经典面试题一:如何保证消息不丢失
分析消息传输的流程可以知道,必须要保证消息生产,存储,消费三个过程都不能有消息丢失。
1.生产阶段
利用请求确认机制,保证消息发送成功,如果没收到ack那么需要重试,如果重试失败,那么看场景分析。可以直接将整个业务方法失败使得流程报错,这样后续的消息都不会再传了也就不会有消息丢失。也可以让业务的处理都正常,然后通过落库等手段保存这条消息,后续用定时任务重新发送或者用其他手段补偿
2.存储阶段
设置broker同步刷盘,这样可以防止断电造成内存中的数据丢失。集群模式的话选择同步复制,显然这两种方式都会降低性能。
3.消费阶段
确保只有在对应消息的业务流程处理完毕后,再给broker返回消费确认,提交点位。
经典面试题二:如何保证消息不重复
首先消息一定会重复,这是避免不了的。举个例子,消费者从一个消息队列拉取一条消息后,消费者突然断开连接了,但还是在本地消费了这条消息,然后负载均衡重平衡这条队列又分给另一个消费者,这个消费者拉取这条消息去消费,这样这条消息被消费了两遍。
解决方法:
1.利用幂等性原理
比如设计时使用update age = 2.5 from people where name = 'caixukun',这条语句执行多次的结果是一样的。但是比如没法用天然幂等,比如加积分的操作,需要用score=score+3,这样没法保证幂等性。可以利用前置操作实现幂等,比如说下单和加积分两个操作,我们先处理下单,用update order set status = 1 where order No=123 and status = 0;添加一个status的判断,如果消息已经被消费过,那么orderNo 123这个订单的status肯定已经是1了,这样就不会接着往下面去执行加积分的操作(二者是连在一起的)。
2.利用mysql的唯一索引。每条消息加一个带唯一值的ID字段,然后用Mysql根据ID建索引,每次消费成功都往里面加一条记录。如果出现重复消费的情况会报错。
3.利用Redis的SETNX。同理可以每次消费成功都以ID为值SETNX一次,如果重复会报错捕获异常就可以处理了。
HTTPS
主要解决窃听风险,篡改风险,冒充风险。
方法是信息加密,校验机制,身份证书

浙公网安备 33010602011771号