什么是分布式系统中的幂等性

最近很多人都在谈论幂等性,好吧,这回我也来聊聊这个话题,光看着俩字,一开始的确有点一头雾水,语文不好嘛,词太专业嘛,对吧

现如今我们的系统大多拆分为分布式SOA,或者微服务,一套系统中包含了多个子系统服务,而一个子系统服务往往会去调用另一个服务,而服务调用服务无非就是使用RPC通信或者restful,既然是通信,那么就有可能再服务器处理完毕后返回结果的时候挂掉,这个时候用户端发现很久没有反应,那么就会多次点击按钮,这样请求有多次,那么处理数据的结果是否要统一呢?那是肯定的!尤其再支付场景。

幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额发现多扣钱了,流水记录也变成了两条...

在以前的单应用系统中,我们只需要把数据操作放入事务中即可,发生错误立即回滚,但是再响应客户端的时候也有可能出现网络中断或者异常等等。

在增删改查4个操作中,尤为注意就是增加或者修改,

查询对于结果是不会有改变的,

删除只会进行一次,用户多次点击产生的结果一样

修改在大多场景下结果一样

增加在重复提交的场景下会出现

那么如何设计接口才能做到幂等呢?

方法一、单次支付请求,也就是直接支付了,不需要额外的数据库操作了,这个时候发起异步请求创建一个唯一的ticketId,就是门票,这张门票只能使用一次就作废,具体步骤如下:

  1. 异步请求获取门票
  2. 调用支付,传入门票
  3. 根据门票ID查询此次操作是否存在,如果存在则表示该操作已经执行过,直接返回结果;如果不存在,支付扣款,保存结果
  4. 返回结果到客户端

如果步骤4通信失败,用户再次发起请求,那么最终结果还是一样的

方法二、分布式环境下各个服务相互调用

这边就要举例我们的系统了,我们支付的时候先要扣款,然后更新订单,这个地方就涉及到了订单服务以及支付服务了。

用户调用支付,扣款成功后,更新对应订单状态,然后再保存流水。

而在这个地方就没必要使用门票ticketId了,因为会比较闲的麻烦

(支付状态:未支付,已支付)

步骤:

1、查询订单支付状态

2、如果已经支付,直接返回结果

3、如果未支付,则支付扣款并且保存流水

4、返回支付结果

如果步骤4通信失败,用户再次发起请求,那么最终结果还是一样的

对于做过支付的朋友,幂等,也可以称之为冲正,保证客户端与服务端的交易一致性,避免多次扣款。

最后来看一下我们的订单流程,虽然不是很复杂,但是最后在支付环境是一定要实现幂等性的

原文发布于微信公众号 - BeJavaGod(wxleechenxiang)

原文发表时间:2017-03-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小怪聊职场

爬虫|使用python爬取微信公众号全部的文章(永久链接)——技术难点

75450
来自专栏北京马哥教育

linux系统被入侵后处理实战

作者 李振良 | 来源 51cto 糖豆贴心提醒,本文阅读时间8分钟,文末有秘密! ? 事件背景 操作系统:Ubuntu12.04_x64 运行业务:公司...

53050
来自专栏kevin-blog

ubuntu实现定时弹窗

最近在头条上看到,长期久坐8小时以上会影响生育能力,突然有点慌,作为一个IT工作者,8小时....然后我这人没有喝水的习惯,经常专注电脑,就想着,有没有什么办法...

16410
来自专栏FreeBuf

没有外部工具,如何快速发现Windows中毒了

从事应急响应工作几年之后,我认为总结一份快速确定计算机是否被感染木马和病毒的“方法论”是十分有用的。这显然不是那么简单的,可我却发现感染几乎存在于所有不复杂的攻...

22250
来自专栏FreeBuf

DarkHydrus使用Phishery在中东地区窃取凭证

在上周,Unit 42发表了一个篇关于介绍一个名为DarkHydrus的新威胁组织的博文,我们观察到该组织的目标是位于中东地区的政府实体。在这篇文章中,我们对通...

6520
来自专栏安恒网络空间安全讲武堂

【译】Cromos – 下载并注入代码到谷歌 Chrome 浏览器扩展中

? cromos是一个用于下载Chrome网页商店合法扩展的工具,还可以在应用程序背景下注入代码。并且举例而言,cromos通过PowerShell创建可执行...

23460
来自专栏黑白安全

美国 Comcast 网站因漏洞泄露 Xfinity 路由器的客户数据

两名研究人员近日发现美国用于激活 Xfinity 路由器的 Comcast 网站会泄露用户的敏感信息。Concast 网站主要用于建立家庭互联网和有线电视服务,...

19720
来自专栏Youngxj

QQ显示IP地址方法

37130
来自专栏IT技术精选文摘

窥探Nginx内部实现:如何为性能和规模进行设计

NGINX在网络性能方面处于领先地位,这一切都是由于软件的设计方式。尽管许多Web服务器和应用程序服务器使用简单的线程或基于进程的架构,但NGINX具有复杂的事...

21250
来自专栏IT技术精选文摘

分布式事务了解吗?你们如何解决分布式事务问题的?

也叫做两阶段提交事务方案,这个举个例子,比如说咱们公司里经常tb是吧(就是团建),然后一般会有个tb主席(就是负责组织团建的那个人)。

39710

扫码关注云+社区

领取腾讯云代金券