平安某金所奇葩的面经-关于幂等和ROA设计的反思
在公司一直在做跟支付有关的项目,某日接到平安某金所一男子电话,应该是之前某猎头投的,我正好在吃早饭(也不能怪他们上班早,我们公司弹性工作制,我一般上班比较晚)。
因为饭馆信号不好,只能赶紧放下剩下的半碗馄饨(肉痛啊),走了一公里(那片移动信号真是渣)。
终于可以正常交流了。对方让我先挑一个项目说说,我一听这套路,牛啊!跟之前的阿里一样(以后找机会再聊聊那次面经),肯定是随机在我项目中找点来问了,那我就开始说,说到有个补扣款的场景,一开始设计每次客户端发差额过来,很难保证幂等性,后来设计让客户端发总额过来,幂等问题解决了。这里我重申下幂等定义啊,想必大家都知道了,就是对于一个操作,多次执行,副作用是一样的,而不是叠加的。比如我扣款,如果我无法分清客户端过来的差额是补扣还是重试,那么很可能多扣客人钱。
那么问题来了,总额模式为什么能解决问题?某金所面试官逮到机会发问,而且我注意到他的发问仿佛是循循善诱,告诉我,年轻人,你是不是不懂幂等啊,跟我这里乱讲,我知道的解决幂等的方案是不一样的喔!我当时没反应过来,觉得大牛应该不用我解释幂等吧,应该是在考校我,那么我就描述了一下场景,如果保险费原来是10元,客户端增加了10元,加一加,20元给我,那么即使这个20元给了多次,保险费还是20元不会变,是不是这个理?
然后奇葩的事情发生了,面试官开启教育模式,后面就一直是他在说,说我这个只是业务上的变动而已,并没有真正的解决幂等啊(我心想这怎么没解决幂等呢,从定义上来说解决了啊),然后又说,差额也能解决幂等问题啊,我就可以解决!我赶紧说,我也可以,就是用唯一的UUID策略,重发的话使用上次同样的UUID,那么我这边服务就不做处理落。他说,你知道为什么不说呢,这个才是技术上的正解啊,你跟我说业务上的东西干嘛啊,你说的根本解决不了问题,还是要用这方案才行。我说,这个是基础的东西,类似接口实现都会那么做啊,但是由于是老的协议,这个临时方案改动最小,也最经济。然后面试官沉默了一会儿,问我,你说说你在Java方面的心得吧,我说了一点,但是明显感觉他在敷衍了。后来就没有后来了。
说真的,这次面经真是让我深受打击,面试官到底是大牛呢,还是只知道背书的奇葩呢?但是,正是因为人家是平安某金所的总监(也许吧),我只是渣渣程序员一枚,这种地位差距导致了我对自己知识和经验的怀疑。
但是最近看到了大神Jim Webber的大作REST in Practice,我重新找回了自信心,其中介绍到HTTP的PUT方法是幂等的,为什么呢,解释是这样的(我直接打中文了),“由于PUT请求是幂等的(因为服务端状态被客户端状态整个地替代了),消费者可以安全地按照自己的需要多次重复该操作......”。
这里大神提到的其实是一种面向资源的设计理念(ROA),PUT方法实现对资源的更新,就像保险费,如果你把它看成是资源,那么每次就应该直接用新值替换(总额替代总额),而如果你把修改保险费本身看成一种操作,每次需要扣多少钱(总额减差额),那么就会破坏幂等,而我们现在大多WebService的设计都是基于操作的思维,为了实现幂等又引入一套复杂的机制,人为添加了复杂性。
平安某金所奇葩的面经-关于幂等和ROA设计的反思的更多相关文章
- [从源码学设计]蚂蚁金服SOFARegistry之消息总线
[从源码学设计]蚂蚁金服SOFARegistry之消息总线 目录 [从源码学设计]蚂蚁金服SOFARegistry之消息总线 0x00 摘要 0x01 相关概念 1.1 事件驱动模型 1.1.1 概念 ...
- [从源码学设计]蚂蚁金服SOFARegistry之存储结构
[从源码学设计]蚂蚁金服SOFARegistry之存储结构 目录 [从源码学设计]蚂蚁金服SOFARegistry之存储结构 0x00 摘要 0x01 业务范畴 1.1 缓存 1.2 DataServ ...
- [从源码学设计]蚂蚁金服SOFARegistry之服务上线
[从源码学设计]蚂蚁金服SOFARegistry之服务上线 目录 [从源码学设计]蚂蚁金服SOFARegistry之服务上线 0x00 摘要 0x01 业务领域 1.1 应用场景 1.1.1 服务发布 ...
- [从源码学设计]蚂蚁金服SOFARegistry之配置信息
[从源码学设计]蚂蚁金服SOFARegistry之配置信息 目录 [从源码学设计]蚂蚁金服SOFARegistry之配置信息 0x00 摘要 0x01 业务范畴 1.1 配置作用 1.2 学习方向 0 ...
- EntityFreamWork和Mvc 精品知识点
定义了DbRepository<TEntity>:IRepository<TEntity> ,SimpleDbContext继承了DbContext, UnitOfWork:I ...
- Android子线程更新主界面
学习什么的还是要真正的有应用,有需求才能在最短的时间里面牢牢掌握一项技术. 今天就是这样的,产品一个需求下来,十万火急啊.然后之前只稍稍接触过,只能硬着头皮上了.最后牢牢地掌握了最简单的Handler ...
- OO第1~3次作业总结
作业1——多项式运算 基于度量和类图分析设计 先看Metrics插件做出的复杂度分析: 乍一看没有红色报警,其实是因为选中某一行时会自动将该行改为黑色,无论之前是红色还是蓝色emmm 真正展开第一行时 ...
- go递归函数如何传递数组切片slice
数组切片slice这个东西看起来很美好,真正用起来会发现有诸多的不爽. 第一,数组.数组切片混淆不清,使用方式完全一样,有时候一些特性又完全不一样,搞不清原理很容易误使用. 第二,数组切片的appen ...
- 软工网络15团队作业8——Beta阶段敏捷冲刺(Day4)
提供当天站立式会议照片一张 每个人的工作 1.讨论项目每个成员的昨天进展 赵铭: 在知晓云上建立数据表 吴慧婷:做了背单词界面并学习了词库界面的设计. 陈敏: 我的词库-全部词汇功能/新建词汇功能全部 ...
随机推荐
- UVA 1358 - Generator(dp+高斯消元+KMP)
UVA 1358 - Generator option=com_onlinejudge&Itemid=8&page=show_problem&category=524& ...
- 使用JavaScript检测浏览器
假设你真的需要检测浏览器的类型,使用JavaScript非常easy达到. View Demo Download Source from GitHub JavaScript有一个navigator的标 ...
- apache tomcat 集群! (转)
公司需要一个内部测试局域网, 要求可以支持3000并发访问!以前也没做过服务器这方面.临时抱佛脚,查看了N多文档,他人经验,布置好之后,又遇到了N多问题,功夫不负有心人.终于还是完成了要求!观他人的布 ...
- linux下getsockopt和setsockopt具体解释及測试
linux下getsockopt和setsockopt具体解释及測试 NAME 名字 getsockopt, setsockopt - get and set options on sockets 获 ...
- 使用live delegate on解决js后装html故障问题
今天写一个前端的东西.每学到更多的知识.几下就能写几行代码.代码行数十个.代码几个文件量--这是真的.一直以来研究的前端遇到的问题仍然在实践百度谷歌问答. 我今天遇到这样的问题:已经写js代码,正确a ...
- [SignalR]配置路由
原文:[SignalR]配置路由 注册路由,在代码如下(SignalR 1.*): 脚本修改如下: 但是其官方文档解释是: By default, the route URL which client ...
- android怎么在launcher改动内置apk的icon
找到launcher下的IconCache中加入变量用来存储要改动apk的包名 及要改动成的icon private String[] className = {"com.google.an ...
- 使用C++实现功能下载文件
今天问一个同学C++实现的下载链接下载并保存给定的文件,互联网搜索.看到这样的事情在网上.因此,改变下直接带来,因为他的代码是在VC++,我导入到VS2010中出现点小问题.所以改了下贴了个VS中亲測 ...
- WordPress添加评论回复的电子邮件警报通知
评论回复帖子,主动发送电子邮件通知评论员,这是提高的一大举措的用户体验.倡导孟一直在使用Willin Kan主评论回复电子邮件警报通知码,我相信很多人也使用,假设你没有使用.最好的尝试. 根据自己的需 ...
- poj 2565 Ants (KM+思维)
Ants Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4125 Accepted: 1258 Special Ju ...