Skip to content

Commit 7f25b0c

Browse files
committed
2022年09月25日
1 parent f47b83a commit 7f25b0c

20 files changed

+334
-0
lines changed
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
---
2+
title: 阿里面试官:接口的幂等性怎么设计?
3+
shortTitle: 阿里面试官:接口的幂等性怎么设计?
4+
description: 偏高级开发的面试题
5+
author: 狂聊君
6+
category:
7+
- 微信公众号
8+
head:
9+
---
10+
11+
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-almsgjkdmdxzysj-79c84d70-cae4-4400-8472-fcef61829f71.jpg)
12+
13+
14+
15+
球友们好,最近负责的几个接口,都涉及到了幂等性的操作,抽空总结了一下,这也是面试官比较爱问的问题。
16+
17+
## 一、什么是幂等?
18+
19+
看一下维基百科怎么说的:
20+
21+
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-almsgjkdmdxzysj-cfaa3367-206d-44fb-97ac-a32b9c6f2242.jpg)
22+
23+
**幂等性:**多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。
24+
25+
## 二、使用幂等的场景
26+
27+
### 1、前端重复提交
28+
29+
用户注册,用户创建商品等操作,前端都会提交一些数据给后台服务,后台需要根据用户提交的数据在数据库中创建记录。如果用户不小心多点了几次,后端收到了好几次提交,这时就会在数据库中重复创建了多条记录。这就是接口没有幂等性带来的 bug。
30+
31+
### 2、接口超时重试
32+
33+
对于给第三方调用的接口,有可能会因为网络原因而调用失败,这时,一般在设计的时候会对接口调用加上失败重试的机制。如果第一次调用已经执行了一半时,发生了网络异常。这时再次调用时就会因为脏数据的存在而出现调用异常。
34+
35+
### 3、消息重复消费
36+
37+
在使用消息中间件来处理消息队列,且手动 ack 确认消息被正常消费时。如果消费者突然断开连接,那么已经执行了一半的消息会重新放回队列。
38+
39+
当消息被其他消费者重新消费时,如果没有幂等性,就会导致消息重复消费时结果异常,如数据库重复数据,数据库数据冲突,资源重复等。
40+
41+
## 三、解决方案
42+
43+
### 1、token 机制实现
44+
45+
通过token 机制实现接口的幂等性,这是一种比较通用性的实现方法。
46+
47+
示意图如下:
48+
49+
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-almsgjkdmdxzysj-d8def2b4-1a77-4e7f-9b2e-5110c9ab5078.jpg)
50+
51+
具体流程步骤:
52+
53+
1. 客户端会先发送一个请求去获取 token,服务端会生成一个全局唯一的 ID 作为 token 保存在 redis 中,同时把这个 ID 返回给客户端
54+
2. 客户端第二次调用业务请求的时候必须携带这个 token
55+
3. 服务端会校验这个 token,如果校验成功,则执行业务,并删除 redis 中的 token
56+
4. 如果校验失败,说明 redis 中已经没有对应的 token,则表示重复操作,直接返回指定的结果给客户端
57+
58+
注意:
59+
60+
1. 对 redis 中是否存在 token 以及删除的代码逻辑建议用 Lua 脚本实现,保证原子性
61+
2. 全局唯一 ID 可以用百度的 uid-generator、美团的 Leaf 去生成
62+
63+
### 2、基于 mysql 实现
64+
65+
这种实现方式是利用 mysql 唯一索引的特性。
66+
67+
示意图如下:
68+
69+
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-almsgjkdmdxzysj-208d134d-0a90-4b93-8ddc-a872ac41865d.jpg)
70+
71+
具体流程步骤:
72+
73+
1. 建立一张去重表,其中某个字段需要建立唯一索引
74+
2. 客户端去请求服务端,服务端会将这次请求的一些信息插入这张去重表中
75+
3. 因为表中某个字段带有唯一索引,如果插入成功,证明表中没有这次请求的信息,则执行后续的业务逻辑
76+
4. 如果插入失败,则代表已经执行过当前请求,直接返回
77+
78+
### 3、基于 redis 实现
79+
80+
这种实现方式是基于 SETNX 命令实现的
81+
82+
SETNX key value:将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。
83+
84+
该命令在设置成功时返回 1,设置失败时返回 0。
85+
86+
示意图如下:
87+
88+
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-almsgjkdmdxzysj-96148d2e-33df-4466-b247-611a86d18d6f.jpg)
89+
90+
具体流程步骤:
91+
92+
1. 客户端先请求服务端,会拿到一个能代表这次请求业务的唯一字段
93+
2. 将该字段以 SETNX 的方式存入 redis 中,并根据业务设置相应的超时时间
94+
3. 如果设置成功,证明这是第一次请求,则执行后续的业务逻辑
95+
4. 如果设置失败,则代表已经执行过当前请求,直接返回
96+
97+
## 总结
98+
99+
这几种实现幂等的方式其实都是大同小异的,类似的还有使用状态机、悲观锁、乐观锁的方式来实现,都是比较简单的。
100+
101+
总之,当你去设计一个接口的时候,幂等都是首要考虑的问题,特别是当你负责设计转账、支付这种涉及到 money 的接口,你要格外注意喽!
102+
103+
104+
105+
>参考链接:[https://mp.weixin.qq.com/s?__biz=MzAxNTM4NzAyNg==&mid=2247491859&idx=1&sn=09da5c3f7e28fe6b5958645d16637fed&chksm=9b8671eeacf1f8f8195b748d37c9a41c54b152edc24f71a750502bde0b7425c575975ca61baf&scene=27#wechat_redirect](https://mp.weixin.qq.com/s?__biz=MzAxNTM4NzAyNg==&mid=2247491859&idx=1&sn=09da5c3f7e28fe6b5958645d16637fed&chksm=9b8671eeacf1f8f8195b748d37c9a41c54b152edc24f71a750502bde0b7425c575975ca61baf&scene=27#wechat_redirect),出处:程序员小富,整理:沉默王二
106+
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
---
2+
title: 老板接了个新项目,程序员预估两周上线,结果用了十一周,太离谱了...
3+
shortTitle: 老板接了个新项目,程序员预估两周上线,结果用了十一周,太离谱了...
4+
description: 新项目来了,开始估算时间!
5+
category:
6+
- 微信公众号
7+
head:
8+
---
9+
10+
以下文章来源于不会笑青年 ,作者不笑青年
11+
12+
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-laobjlgxxmcxyyglzsxjgylsyztlpl-5260cccc-7d81-4d14-9fa3-565d5a500d6c.jpg)
13+
14+
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-laobjlgxxmcxyyglzsxjgylsyztlpl-eb25dbd2-1bea-4d6c-91c1-f3c81d624e32.jpg)
15+
16+
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-laobjlgxxmcxyyglzsxjgylsyztlpl-92f46ac9-a43d-4203-b768-3386117dd620.jpg)
17+
18+
19+
20+
21+
22+
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-laobjlgxxmcxyyglzsxjgylsyztlpl-bbce40d1-43f6-4a5f-b457-7551055ee4fc.jpg)
23+
24+
25+
26+
**本文原创公众号:****不会笑青年,授权转载请联系微信(laughyouth369)******
27+
28+
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
---
2+
title: 你的编程能力从什么时候开始突飞猛进?
3+
shortTitle: 你的编程能力从什么时候开始突飞猛进?
4+
description: 百度多了你就明白:它也许有用,但它封印了你精进计算机英语的机会。Google多了你就明白:各地大佬们的文…
5+
tags:
6+
- 优质文章
7+
author: 口天师兄
8+
category:
9+
- 知乎
10+
head:
11+
- - meta
12+
- name: keywords
13+
content: 程序员,编程,编程入门,自学编程
14+
---
15+
16+
**百度多了**
17+
18+
你就明白:它也许有用,但它封印了你精进计算机英语的机会。
19+
20+
**Google多了**
21+
22+
你就明白:各地大佬们的文章很Nice,但它们仅是你技术知识体系的精华补充。
23+
24+
**开始读书了**
25+
26+
你就明白:你以往东拼西凑几十篇烂文才明白的事,书上那几页纸都写着,而且详细的很。
27+
28+
**接触到国内外大社的经典书后**
29+
30+
你就明白:那些烂大街的21天宝典,7周速成,都是些什么玩意,误人子弟!
31+
32+
图灵牛逼,动物牛逼,Manning牛逼。
33+
34+
**好书读多了**
35+
36+
你就明白:技术是一环扣一环的,有牢固的技术知识体系,学啥都事半功倍。
37+
38+
**多做业务**
39+
40+
你就明白:所学的技术该用在哪。
41+
42+
**多做用户量大的业务**
43+
44+
你就明白:光会用技术,和用好技术是两码子事。
45+
46+
**多找第三方开源**
47+
48+
你就明白:原来工作摸鱼不是梦。
49+
50+
**太随便用第三方**
51+
52+
你就明白:某天需求一变,它兼顾不到,可以把你往死里坑,坑到你得去看源码。
53+
54+
**第一次看完源码**
55+
56+
你就明白:开始还是很讨厌的,等全盘搞明白了,发现“咦~有点意思”。
57+
58+
**源码看多了**
59+
60+
你就明白:自己的查克拉莫名的增多了。而且吐槽文档不全的习惯也渐渐少了,一个不服就跑去观摩别人的源码,顺便偷个师。
61+
62+
再往后,或许你的技术确实突飞猛进了,然而你却只会觉得编程本来就是这个样子的。
63+
64+
**因为,但凡通过点滴付出,累积出来的结果,都是平淡无声的。**
65+
66+
* * *
67+
68+
突然获得这么多支持,十分感谢大家。
69+
70+
知乎就是师兄的心得记事本,喜欢的可以[关注](https://www.zhihu.com/people/guwensir/activities)~
71+
72+
书籍方面的,师兄会找个时间,专门出一波,以谢大家的支持。
73+
74+
75+
76+
**相关 IT 高赞干货:**
77+
78+
**师兄总结的一波行业经验(精华版)**
79+
80+
81+
82+
[](https://www.zhihu.com/question/312019918/answer/765332780)
83+
84+
**师兄多年来对编程的小感悟**
85+
86+
87+
88+
[](https://www.zhihu.com/question/59351128/answer/834831006)
89+
90+
91+
92+
[](https://www.zhihu.com/question/339068307/answer/851290983)
93+
94+
**师兄谈自学编程的小心得**
95+
96+
(带过 10 来位新人入行的经验)
97+
98+
99+
100+
[](https://www.zhihu.com/question/322693578/answer/933529176)
101+
102+
103+
104+
[](https://www.zhihu.com/question/25034235/answer/936438673)
105+
106+
107+
108+
**以下为冷门,但我自己很喜欢的知识点。**
109+
110+
**师兄讲编程的难,有趣又真实得心痛**
111+
112+
113+
114+
[](https://www.zhihu.com/question/22508677/answer/949693724)
115+
116+
**师兄实践了多年的自律方法论**
117+
118+
119+
120+
[](https://www.zhihu.com/question/37226968/answer/946211766)
121+
122+
123+
124+
最后,
125+
126+
还是万分感谢大家的支持^\_^。
127+
128+
>参考链接:[https://www.zhihu.com/question/356351510/answer/913928066](https://www.zhihu.com/question/356351510/answer/913928066),整理:沉默王二
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
---
2+
title: 作为 IT 行业的过来人,你有什么话想对后辈说的?
3+
shortTitle: 作为 IT 行业的过来人,你有什么话想对后辈说的?
4+
description: 一、在校期间,一定要好好学习,打扎实基础现在的培训班和网课满大街都是,好像学习编程成了一件很简单的…
5+
tags:
6+
- 优质文章
7+
author: 赛博铁犁
8+
category:
9+
- 知乎
10+
head:
11+
- - meta
12+
- name: keywords
13+
content: IT 工程师,程序员,信息技术(IT),IT 行业,IT 人
14+
---
15+
16+
一、在校期间,一定要好好学习,打扎实基础
17+
18+
现在的培训班和网课满大街都是,好像学习编程成了一件很简单的事。但是等到工作中就会发现。工作中遇到的问题,往往不是直接编程可以解决,往往是一个复杂的体系,这时候,把现实问题转化成IT方案的能力就会变得极其重要。而这种能力,一定是建立在对整体的信息体系结构的理解上的。所以,那些数学,数据结构,计算机原理,网络基础,数据库基础,软件工程,看起来好像和早期的工作没用,但是他就埋藏在你的思维的深处,随着工作经验的增加和处理的问题复杂度的增加,这些知识就慢慢的浮现出来,产生价值。而资深的IT从业者,往往吃的就是这个。不然只是简单的学一门语言的编程,年轻时候混口饭吃还行,年纪稍微大些,根本无法和年轻人拉开差距,大概率等不到35就混不下去了。
19+
20+
二、尽快在某一个领域,达到可以拿的出手的水平
21+
22+
人一定要尽快给自己一个标签,如果没有标签,别人很难去理解你。一个门门通,门门松的人,其他人很难记住和想到你。哪怕以后要转产品,转管理,也一定要在某一个领域,尽可能达到一个让身边人认可的水平。
23+
24+
三、多做反思,多思考自身,尽早确定发展方向
25+
26+
作为IT人,大概率是码农起步。这时候就要多反思,自己是走技术路线,还是管理路线。还是中间路线。要从自己的性格,兴趣点,技术水平多个点去考量。
27+
28+
1. **技术路线:**
29+
30+
首先,要沉得住气,往深处或者框架上去扎。因为基本上,技术流中,核心算法专家和架构师才能熬过35这条线。因为单从写代码的层面上,3-5年经验之上,就很难看出分别了,别人是给你涨工资还是不涨呢?一个中年人产生的价值和年轻人差不多,那别人干嘛要你。怎么办?要么自己表态就是拿低工资毫不抱怨,要么就直接失业。
31+
32+
其次,如果公司提拔你做管理,如果想清楚了走技术,那就不要去搅那潭浑水。最多当个核心领域的小组长带带一群精兵,解决核心问题就好了。千万不要被权力带偏了路线。到时候不尴不尬最痛苦。
33+
34+
**2.管理路线**
35+
36+
如果要走管理路线,那就在**搞好技术的同时**,盯着管理这条线去走。管理路线不需要扎的深,但是基础要扎实,同时好奇心要强,要广博。在早期工作时,就不要做完了自己的就觉得万事大吉,要去关心其他的模块,其他小组,其他部门,整体的生产流程,项目管理,产品设计,销售,都是在干什么。他们有哪些做的好的,哪些做得不好的,如果是你你会怎么做,多推演,多总结。但前提是技术一定要搞好,基础一定要扎实,因为这是日后防止被下属欺骗和遇到问题时快速决断的重要因素。
37+
38+
但,最关键的是,不要沉溺于技术。在技术管理中,最常见的问题就是大领导沉溺技术。中层管理以上的岗位(不直接管理基层的岗位)开始,最重要的工作就转化成了培养人才,笼络人才,团队建设,决策,上下级压力传导,绩效规则制定与考评等等的团队事务上。如非必要,千万千万千万不要参与具体的事项工作和业务细则中去。因为这时候你做得事情不管对错,下属往往不敢说出来。而由于精力有不可能面面俱到。这就会造成,该做的事没做好,不该做的事搅黄了。一定要记住,团队的价值才是管理者的核心价值。
39+
40+
**3.中间路线**
41+
42+
这个指的就是码农转产品。这个职位相比技术流没那么深入,相比管理流,在人事上没那么杂。也是一条可行的路线。这条路线,和管理流一样,要对技术要有了解。如果没有了解。在推进产品的研发上就会很困难。如果是超级大公司有严谨的项目管理流程还好。否则中小型公司,流程基本都是由产品自己推进。研发说这个东西技术上实现不了,或者非常难,心里就要有个数,到底能不能,如果无法判断,那么被忽悠就会没有任何办法。在设计产品的时候,如果对技术不了解,也很容易闹出笑话。特别是针对后台产品。
43+
44+
如果是要走产品路线,在平时就要多注意观察。日常使用的产品,自己公司的产品,客户的产品,其他公司的产品,分别都是怎么设计的,有什么优点,什么缺点,自己在用的过程中,有哪些不方便的地方。和别人接触的时候也多留心,别人是怎么想的,每个不同的角色,他们的需求是什么,他们想要一个什么样的东西来解决什么问题。不同的人,在表达自己意图的时候,会有什么习惯?如何去挖掘人真正的需求?不同的人群有哪些共通的需求?
45+
46+
要多学习,要杂,从任何事情,任何角度,任何产品中学习。想办法让自己站在不同的人的角度上去思考,他们的利益。
47+
48+
**4.总结**
49+
50+
主体的方向就是这三点,里面的细分有千千万。越早发现自己的路线越好。但是也不要太执着。特别是刚毕业的时候,如果发现自己不喜欢或者不适合,那就及早换一个角度试试。如果换了三五次都没有找到适合的点,那就选一个最擅长的。因为本来就只有极少数的人才会对某项事情有特备强烈的情趣或者天份。大部分的人都是在相对平均的状态下对某项事情稍有擅长。试了几次都没发现,那大概率就是一个普通人。那就挑一个擅长的,好好做好它就行。人生不仅仅只有事业。事业也不一定要有极其强烈的兴趣才能做好。
51+
52+
四、关于换工作
53+
54+
每一分工作,每一次换工作,都不要只考虑薪水,要想清楚,这份工作的价值和目标,以及其在整体的战略中的意义。不要漫无目的的换工作。既要让自己在不同领域中学习,又要职位之间互相支撑。这样,随着工作增长的就是多方位的价值。只有价值上升了,才能够支撑随着年龄增长的收入。不然就很容易出现年龄危机。
55+
56+
五、放低姿态
57+
58+
社会的发展是越来越快的,特别是对与IT而言,由于在时代的最前沿,是变化最快的部分。变化最快,也就意味着,年龄带来的沉淀相对而言最小。这就会带来强烈的危机。也就是35岁门槛。而35岁门槛本身一部分是能力,一部分是资本,还有很大一部分是来源于态度。很多人喜欢倚老卖老耍资历,这就除了问题。能力不够,收入不降,又不接受比自己年轻的领导,那么谁敢用?
59+
60+
所以,如果在工作中遇到了特别强的年轻人当了自己的领导,千万不要郁闷,要庆幸。这是人生难得的际遇。如果一个人能够坐在比他大好几岁的人才能坐的位置上,那么要么是他能力特别强,要么是他有特殊的资源,要么是真的运气好。不管哪种。都会比一般人爬得快的多。如果跟着这种领导,往往比跟着年纪大的要升迁的更加轻松。想一想,一个人花了五年走了别人十年甚至能多的路,那他后面五年呢?人要接纳自己的平凡。这时候,不要郁闷,要去辅佐他。用年龄大带来的情商去安慰他,把工作中的踩坑经验传给他,帮他成长。只要这不是一个人品极差的人。你所付出的,一定会有所回报的。就算你不会一直跟着他干。想象一下,如果自己帮过的人,以后成了大牛。他随手的一拉,可能就能解决一个巨大的问题。他随便共享的一点消息,可能给自己的人生带来巨大的变化。
61+
62+
**六、多在找伴侣的事情上用点心**
63+
64+
大多数的人都是凡人,很难一个人长期独自生活。婚姻是最好的情绪抚慰和经济互助的共同体。一个好的伴侣,带来的情绪价值和经济支撑是非常巨大的。对于大多数人而言,单身和不合适的伴侣,带来的情绪困扰,不仅仅让人不开心,而且会消耗人的情绪力量,反过来影响工作。
65+
66+
所以,一定不要小看这个事情,提早准备。多思考,多观察。从知乎上,其他渠道中,生活中的你敬重的人,同龄的异性。多去想想,自己对爱情和婚姻的期待是什么。自己是什么样的人,什么样的人可以和自己长久的生活。这样的人他的生活是怎样的,如何才能接触到。
67+
68+
**总之,**凡事预则立,不预则废。一切都做好准备,不要被营销号带着走。想清楚自己的人生要怎么过。IT是最好的领域,但也是最容易被淘汰压力最大的领域。做好了对于底层来说,就是阶层上升最佳最稳妥的通道,安身立命的好方法。做不好,可能三十几岁就会陷入危机。
69+
70+
人生苦难重重。加油吧。
71+
72+
>参考链接:[https://www.zhihu.com/question/312019918/answer/1449095344](https://www.zhihu.com/question/312019918/answer/1449095344),整理:沉默王二
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
76.9 KB
Loading
Loading

0 commit comments

Comments
 (0)