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

主要解决窃听风险,篡改风险,冒充风险。

方法是信息加密,校验机制,身份证书

posted @   vast_joy  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示