阿里蚂蚁金服面试--幂等性实现
Posted go大鸡腿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阿里蚂蚁金服面试--幂等性实现相关的知识,希望对你有一定的参考价值。
前言
由于之前没有总结完整,导致在面试的时候老是有卡壳,比如说最近微众银行的二面,如果通过数据库来实现幂等性
参考文章
MQ方案
在服务端的时候是at lease one,就是会多次发送保证说在网络问题或者客户端宕机等等情况下,可以进行多次发送,保证客户端能接收到。那么这时就需要去重。
去重
主要通过messageId进行相应的去重
相关思想
就是有消息状态表,还有对应的标识,可以是messageId或者业务id,去重过程是去查询是否已经消费这条消息,当然如果客户端代码有问题,那么会进行消息重试机制。
DB方案
可以参照mq的方案,下面是几种情况
- 就是会有个消息表,以业务id来构建唯一键,然后插入成功,就执行业务,然后标识消息执行完成的状态。
- 插入消息成功,但是业务失败的话,会改成失败的标识,方便后续重试。
- 插入消息成功,宕机了,那么这里像文章里面讲的,消息表需要一个过期的时间,也就是那些正在执行的消息,过了某个过期时间还没修改状态,那么需要剔除。
- 插入消息失败,证明重复消费,剔除即可
其他简单的像:查询的时候用for update,其他就修改不了这条数据。进行相应的修改等等
redis方案
只需要实现分布式锁,以业务id为key,然后先查询有没有对应的数据,没有再插入,然后释放锁。
这时像那些重发很快的请求,肯定是没有拿到锁的,直接剔除。
如果说业务执行完,因为种种原因导致又重发,可以在查询对应数据的步骤,将请求剔除。
比如说订单id为1,用户A给商家b付款,这时肯定有相应的支付流水,可以根据这个去作为判断。
以上是关于阿里蚂蚁金服面试--幂等性实现的主要内容,如果未能解决你的问题,请参考以下文章
阿里P7Java最全面试296题:阿里天猫蚂蚁金服含答案文档解析