提高系统稳定性-幂等性-1

771 阅读3分钟

前言

幂等性是个很有意思的概念, 大概是指一个函数被同一个入参反复调用, 每次产生的效果都保持一样, 经常和防重放在一起, 主要用于防止接口的重复提交和防止消息的重复消费或者保持消息的顺序消费和一些其他场景吧, 还有一些学术一些的分类, 比如 select/get 接口是幂等的, 其实这也没啥用.

幂等必要性

这个要讲起来涉及事务可见性, 重试机制, 消息队列特性, 对应的方案有分布式锁, 乐观锁, 状态机等, 所以我打算多水几篇文章, 这次打算单纯讨论下幂等防重方向的必要性

场景一:

比如这个是程序员必备网站之一 Github 的注册页面, 我相信在座的各位技术爱好者都注册过这个, 那么问题是这样的, 如果我填入了用户名 codog代码狗, 密码 xxxx, 我单身三十年麒麟臂早就练好了, 手速快呀, 啪啪啪连着点了两下, 结果给我注册了两个账号, 新手福利加倍, 能

多看一倍的视频

(不是不是, 多上传一倍的代码), 这就是幂等性对于防重很重要的一点了, 防止表单重复提交

这有一个前端的解决方案, 就是用户点击了按钮之后按钮置灰, 但是这个第一是不能防君子不防小人, 用户还是有调用接口的可能, 二是如果当时客户端机器不太行, 没有及时置灰, 还是点击了两次.

场景二:

比如我们系统消费别人的打赏消息, 每接收一个消息我们就给 codog代码狗 打赏一个亿, 由于消息队列不保证一个消息只发一次, 同时或者很短时间发送了两次, 或者之前的消息重发了一次, 这时候就打了两个亿.

这个也有一个方案, 就是使用准确的只发一次的消息的消息队列, 但是这样就大大降低了消息队列应有的性能了, 我们一般编程的时候应该尽可能的把压力放到应用程序, 而不是数据库消息队列这种中间件上.

其实针对不同的系统不同的场景幂等性也没有绝对银弹, 但是一些相对通用的方法确实是可以讨论的, 放在下篇文章啦, 记得关注公众号 codog代码狗 哦.

广告

job.toutiao.com/s/JnnorYG

字节跳动上海 java 团队招聘, 工作内容如上, 要求有 java 基础, 会基本算法, 做事认真, 有技术热情

福利: 高于行业平均工资, 无限量免费零食三餐, 娱乐室乒乓球台球健身房, 入职赠送内推费, 加班双倍工资, 团队氛围好,追求极致,大家互相交流技术和生活,一起背锅一起进步,不强制绩效分配,鼓励创新和试错

感兴趣投递上面的链接, 或者需要写内推语可以联系微信 wangwenhan2013, 或者简历直接发送到 wangwenhan@bytedance.com

微信原文地址: mp.weixin.qq.com/s?__biz=MzU…