[[Web&Http学习]]
1.简介
Http协议涉及到的一种重要性质: 幂等性. 在HTTP/1.1规范中幂等性的定义是:
Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.
从定义上看, HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用.
实际上, 幂等性是分布式系统设计中十分重要的概念, 而Http的分布式本质也决定了他在Http中具有重要地位.
2.Http方法的幂等性
若干次请求的副作用与单次请求相同或者根本没有副作用, 那么这些请求方法就能够被视作<mark style="background: #FF5582A6;">幂等</mark>的.
| 序号 | 方法 | 是否幂等 |
|---|---|---|
| 1 | GET | 是 |
| 2 | HEAD | 是 |
| 3 | PUT | 是 |
| 4 | DELETE | 是 |
| 5 | OPTIONS | 是 |
| 6 | TRACE | 是 |
| 7 | <mark style="background: #FFB86CA6;">POST</mark> | <mark style="background: #FFB86CA6;">不是</mark> |
| 8 | <mark style="background: #FFB86CA6;">PATCH</mark> | <mark style="background: #FFB86CA6;">不是</mark> |
Http方法中:
- GET方法: 用于获取资源, 不会影响到资源的变化, 所以是幂等的.
- POST方法: 表示创建资源, 两次相同的POST请求会在服务器创建两份资源, 他们具有不同的URI, 所以不具备幂等性.
- HEAD方法: 向服务索要与GET请求相一致的响应, 只不过响应体不会被返回, 所以是幂等的.
- PUT方法: 表示更新资源, 而PUT所对应的URI是要创建或更新的资源本身, 对同一URI进行多次PUT的副作用和一次PUT的副作用是相同的, 所以是幂等的.
- DELETE方法: 用于删除资源, 有副作用, 但是应该满足幂等性
- OPTIONS方法: 返回服务器针对特定资源所支持的HTTP请求方法, 所以是幂等的.
- TRACE方法: 可以回显服务器收到的请求, 主要用于诊断或测试, 所以是幂等的.
- PATCH方法: 类似于POST和PUT, 但是它每次是部分更新资源, 所以是非幂等的
3.分布式事务 VS 幂等设计
3.1 业务场景
订单支付过程中, 账户余额的变动(遇到系统异常, 或者其他操作等非正常操作的时候)
3.1 分布式事务
分布式事务调用者很简单, 复杂性都交给了中间件来管理.
缺点: 一是架构太重量级, 容易被绑在特定的中间件上, 不利于异构系统的集成; 二是分布式事务能保证事务的ACID性质, 但是无法提供性能和可用性保证.
3.2 幂等设计
服务器端生成唯一的处理号, 将它用于标识后续的操作, 一个处理号表示的操作至多只会被处理一次, 每次调用都将返回第一次调用时的处理结果, 这样就符合幂等性.
幂等设计是一种轻量级的解决方案, 容易适应异构环境, 以及性能和可用性方面. 某些性能要求高的场景或应用, 幂等设计往往是唯一的解决方案.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。