热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

分布式服务接口如何实现幂等性

什么是幂等性幂等性:就是用户对于同一操作发起的一次请求,或者多次请求的结果是一致的,多次请求不会影响系统状态。没有幂等性的情况最常见的例子就是支付,比如用户购买商品后进行支付,支付

什么是幂等性

幂等性:就是用户对于同一操作发起的一次请求,或者多次请求的结果是一致的,多次请求不会影响系统状态。

没有幂等性的情况

最常见的例子就是支付,比如用户购买商品后进行支付,支付扣款成功,但是返回结果的时候网络异常,用户再次点击按钮,那么此时会进行第二次扣款,返回结果成功,用户查询余额发现扣了两次钱,流水记录也变成了两条。这不是坑爹嘛。
《分布式服务接口如何实现幂等性》

又可能用户不知道怎么得对一个订单发起了两次支付请求,但是这两个请求被负载均衡落在不同的机器上,如果没有做分布式幂等性,那么也会扣款两次。
《分布式服务接口如何实现幂等性》

如何实现幂等性

实现幂等性,就是对一个接口实现,多次发起同一个请求,这个接口得保证结果是准确的,针对这个案例来说就是不能多扣款、不能多插入一条数据。

业务层面上保证幂等性:

  1. 每个请求必须有一个唯一的标识,比如每个订单支付请求都包含订单 id,订单id是唯一的,且每个订单只能支付一次。
  2. 每次处理完请求之后,必须有一个记录标识这个请求处理过了。常见的方案是在 mysql 中记录这个订单的支付流水。
  3. 每次接收请求需要进行判断,判断之前是否处理过。如果有一个订单已经支付了,就已经有了一条支付流水,那么如果重复发送这个请求,则此时先插入支付流水,如果 orderId 已经存在,唯一键约束生效,报错,插入失败,那么就不用再扣款了。

《分布式服务接口如何实现幂等性》

实际运作过程中,还是要结合自己的业务来,比如还可以利用 redis 做幂等性,支付请求处理后可以写一个标识到 redis 里面去,比如 set order_id payed,下一次重复请求过来了,先查 redis 的 order_id 对应的 value,如果是 payed 就说明已经支付过了,那么就不要重复支付了。


推荐阅读
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 本文介绍如何使用JavaScript中的for循环来创建一个九九乘法表,适合初学者学习循环结构的应用。 ... [详细]
  • PHP面试题精选及答案解析
    本文精选了新浪PHP笔试题及最新的PHP面试题,并提供了详细的答案解析,帮助求职者更好地准备PHP相关的面试。 ... [详细]
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • MySQL InnoDB 存储引擎索引机制详解
    本文深入探讨了MySQL InnoDB存储引擎中的索引技术,包括索引的基本概念、数据结构与算法、B+树的特性及其在数据库中的应用,以及索引优化策略。 ... [详细]
  • 龙蜥社区开发者访谈:技术生涯的三次蜕变 | 第3期
    龙蜥社区的开发者们通过自己的实践和经验,推动着开源技术的发展。本期「龙蜥开发者说」聚焦于一位资深开发者的三次技术转型,分享他在龙蜥社区的成长故事。 ... [详细]
  • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
  • 深入解析Dubbo:使用与源码分析
    本文详细介绍了Dubbo的使用方法和源码分析,涵盖其架构设计、核心特性和调用流程。 ... [详细]
  • 本文讲述了一位80后的普通男性程序员,尽管没有高学历,但通过不断的努力和学习,在IT行业中逐渐找到了自己的位置。从最初的仓库管理员到现在的多技能开发者,他的职业生涯充满了挑战与机遇。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
author-avatar
teddy213
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有