2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

REST 之中的幂等指的是什么?

  • 2013-05-11
  • 本文字数:1688 字

    阅读完需:约 6 分钟

REST (或者至少是 HTTP)的一个重要方面就是一些操作(动作)是幂等的。正如 Gregor Roth 在多年前所说的那样:

PUT 方法是幂等的。幂等的方法意味着请求成功执行所得到的的结果不依赖于该方法被执行的次数。

幂等也是在 SOA 设计模式中所讨论的一个问题。多年以来,围绕着 REST 以及相对于其他方式它所能带来的收益已经有了很多的讨论,在这个过程中,幂等只是一个方面,通常我们认为已经对其有所理解了,实际上并没有进行充分地研究。但是,最近在面向服务架构(Service Oriented Architecture)邮件列表中有一个帖子,针对这个看起来很直观的理念,激发了很多的讨论。初始的帖子是这样的:

目前我正在审视我们服务的幂等性并提出一个应用于企业的规定性指导,这个指导将会用于创建幂等服务的场景之中。问题在于,所有的服务都需要是幂等的吗?这现实吗?

它引用了另外的一篇 blog ,在这篇文章中,作者这样说:

当然,对于服务的提供者来说,实现幂等会比较复杂。而复杂性就会花费金钱。这可能就是幂等的服务如此稀少的原因。[…] 但是,服务只要成为幂等的,那么它就会非常简单,并且能够保证跨集成边界的数据一致性。服务 _ 应该 _ 是幂等的。这应该是架构和服务设计的原则。尤其是对于那些被很多消费者使用的服务更应如此。你不能将保持数据一致的复杂性推给你的消费者,对吧?消费者就是你的客户,你应该这样善待他们。如果你能为他们带来便利的话,你会有更多的消费者。

初始的这个帖子引起了很多的响应,包括来自 Cap Gemini 的 Steve Jones ,他这样说到:

幂等是 IT 行业中巨大的垃圾词汇之一,它的意思是“内存中的幂等”(idempotent in memory)。如果你有一个评论的服务,它具备更新的功能,从服务调用者的视角来看,服务必须要维护和管理状态。那你的含义就是它能够在内存中横向扩展。如果你更新状态的话,包括在数据库中,那么就不能保证是幂等的。幂等指的是当你使用相同的值调用相同的功能时,结果完全一致,这是它的数学定义。如果你改变过状态,那么就不是幂等的,而“数据库更新”并不会改变任何事情。

Mark Baker 曾经在 REST 这个话题上曾经有过很多回复,回应了 Steve:

就像你的评论样例所述,确实存在非幂等的状态更新,将一些数据更新为特定的值也会是幂等的更新…因为很显然如果用相同的输入执行多次的话,结果会是相同的。

Steve 在这一点上与 Mark 的观点是一致的:如果具有相同输入的一个操作没有改变任何的事情,那么它是幂等的。但是,如果这个操作改变了任意的状态,比如说它记录了这个请求的最后时间,那么它就不是幂等的。

在 IT 行业中,这个术语长久以来被人们滥用了,这一点我“感触颇深”,我曾经多次见过这样的场景,人们宣称一些事情是“幂等的”只是因为它在内存中是无状态的,尽管其消费者要达到的效果是记录性的事务。

Mark 同意 Steve 的严格定义,但是他相信这不能应用于初始请求的上下文之中,也就是:分布式系统中的幂等性:

[…] 这个词汇只对于接口有意义而不是实现。所以,如果我定义一个操作,比如说“set”,并将其定义为幂等的,那么它会只关系到客户端,即便在这个接口的实现中会产生日志。

另外一个参与者 Ashaf Galal,断言所有“读的服务”(reading services)都是幂等的,因为这样的服务只会返回数据。但是,Steve 指出,这是一个过于简单的视角,有时候一个操作呈现出来的是幂等的,它的实现可以做任何事情但它需要是幂等的就可以(这再次提出了这个问题,那就是这种区分是否重要):

[…] 读的功能不一定是幂等的。“getNextIterator()”是一个读的功能,它不是幂等的,因为它会渐进迭代器。银行账号请求余额可能也不是幂等的,因为会创建审计日志。两个连续调用返回的结果可能是相同的(如果没有变化发生的话),但是日志条目是不同的。

Ashaf 回应了 Steve,他说幂等是服务的属性而不是接口的属性。

客户端需要从服务那里得到适当的响应,他并不关心服务是不是幂等的,是不是要记录日志。

那么,其他人怎么想的呢?对于幂等的含义,是否还有误解?如果一个被视为幂等的操作实际上会改变一些状态,如 Steve 所提到的更新日志,那么这有关系吗?

英文原文链接: What Is Idempotent in REST?

2013-05-11 07:4526904

评论

发布
暂无评论
发现更多内容

100%关税与软件封锁下,信创为何是破局关键?

FinClip

#信创

Volcano v1.13 重磅发布!大模型训练与推理等调度能力全面增强

华为云开发者联盟

容器 华为云 Volcano 华为云开发者联盟

赋能未来:Dify 企业版全链路实战培训,打造企业专属 AI 精英团队

伊克罗德信息科技

AI 记忆进化论:从被动存储到智能管理

蚂蚁开源

伊克罗德信息成为 Dify 合作伙伴,携手共创 AI 应用新未来!

伊克罗德信息科技

微店API使用指南:高效获取商品列表数据

Datafox(数据狐)

微店数据接口 微店API 微店商品列表API 微店数据采集 关键词搜索微店接口

企业海外营销策略与渠道选择全解析

Wolink

企业出海 出海服务商 社媒营销 海外营销推广 沃链Wolink

如何选择靠谱的企业出海服务商?这5点必看

Wolink

出海服务商 出海企业 社媒营销 海外营销推广 达人营销

沐曦 GPU 融入龙蜥,共筑开源 AI 基础设施新底座

OpenAnolis小助手

开源 操作系统 龙蜥社区 龙蜥生态

云原生进化论:加速构建 AI 应用

阿里巴巴云原生

阿里云 AI 云原生

消息推送策略:如何在营销与用户体验间找到最佳平衡点

HarmonyOS SDK

HarmonyOS NEXT HarmonyOS SDK应用服务

浅析cef在win和mac上的适配

京东零售技术

2025 北京文化论坛阿里巴巴沙龙落幕 分享龙蜥在操作系统领域的创新实践

OpenAnolis小助手

开源 操作系统 龙蜥社区

【欢迎提报】2025 龙蜥操作系统大会正式启动议题征集

OpenAnolis小助手

AI 活动 操作系统 龙蜥操作系统大会

可靠传输的TCP协议send成功就意味着数据一定发出去了?

JackJiang

网络编程 即时通讯 IM

nginx证书缓存功能

天翼云开发者社区

AP网关

越用越上头!明基RD320U让我在开发过程中效率起飞

不叫猫先生

办公效率 显示器

超融合厂家解决方案对比:如何选择最适合你的方案?

智驱前线

凌晨零点,一个TODO,差点把我们整个部门抬走

大厂码农老A

前端 故障分析 故障 #java #后端

建材服务商城:数字化建材服务新生态,驱动行业高效协同与用户体验升级

深圳亥时科技

车牌号智能填充快人一步,告别繁琐输入

HarmonyOS SDK

HarmonyOS NEXT HarmonyOS SDK应用服务

探索无限可能:生成式推荐的演进、前沿与挑战

京东零售技术

绿电直连如何协同发电、用电与调度?

西格电力

电力 新能源 绿电直连

基于YOLOv8的动漫人脸角色识别系统:Comate完成前端开发

Comate编码助手

前端开发工具 智能代码助手 AI 编程 文心快码 文心快码Zulu

我发现不管是Java还是Golang,懂AI之后,是真吃香!

王中阳Go

Java Go AI 面试 智能体

Qoder 重磅升级,推出 Quest Remote 功能,像发邮件一样将任务委派到云端

阿里巴巴云原生

阿里云 云原生 Qoder

新闻速递丨Altair 与 Gordon Murray Group 携手开发创新超级轻量化平台

Altair RapidMiner

汽车 仿真 CAE hyperworks 汽车轻量化

使用n8n核心触发器(Cron, Webhook, 手动)开启自动化之旅

测试人

外采业务系统中具备低代码能力,大幅提升企业业务敏捷性

星云低代码中间件

低代码 数字化转型 业务系统 插件化

Nginx 缓存的工作原理

天翼云开发者社区

超融合选型指南:老旧机房改造,五大关键维度对比主流方案

智驱前线

REST之中的幂等指的是什么?_SOA_Mark Little_InfoQ精选文章