幂等性-听起来很复杂,他们很少谈论它,但这适用于在工作中使用API的所有应用程序。
我叫Denis Isaev,是Yandex.Taxi的后端团队之一。 今天,我将与Habr读者分享对如果您不考虑项目中分布式系统的幂等性可能出现的问题的描述。 为此,我选择了有关实习生Vasya的虚构故事的格式,Vasya正在学习使用API。 它将更加直观和有用。 走吧

关于API
API . API POST /v1/orders
:
{
"from": ", . 822",
"to": " "
}
API , : ? , , . API GET /v1/orders
:
{
"orders": [
{
"id": 1,
"from": ", . 822",
"to": " "
}
]
}
API :
GET /v1/orders
, , UI ;- « »
POST /v1/orders
; - .
, , 2 . , . . , , . .

8 : , , . , , VPN , . , . : 7 . , , -. : « » , , , , , , .

: . .
, « ». , . , , .
, , . , : , . -: , . « » . , , ?
, , . : from to 5 . , 500. , , , : . , . , «», , , . , .
, :
- ;
UPDATE active_orders SET n=1 WHERE user_id={user_id} AND n=0;
update
0 , HTTP 409;- ;
- .
409 . , , . .
, : «»: ? : , , , ?! , . : 1 2? . , , .

, , . API, . : . , API — , API 200, 400. API ( , ), .
, HTTP GET, PUT, DELETE , POST PATCH . , GET , POST . , , , - POST PATCH , GET PUT .
idempotency key API.
. (POST) Idempotency-Key , API. UUID V4. Stripe (POST) Idempotency-Key , API. 24. client tokens AWS.
POST /v1/orders idempotency_key, :
{
"from": ", . 822",
"to": " ",
"idempotency_key": "786706b8-ed80-443a-80f6-ea1fa8cc1b51"
}
UUID v4 . . , . , 409. : 409, 200, , 409.

1 2 . :
- , , , ;
- , - , ;
- ;
- , 200;
- , , .
. , : , .
, , , . , AWS IdempotentParameterMismatch .
: , 5xx . , .
-
- .
1:
- , - , ;
- , , ;
- , GET /v1/orders, , ;
- , , ;
- , ;
- .
2:
- , , , ;
- , - : ;
- : , , , .
, :
- 1: . , , .
- 2: deleted_at=now() — soft delete. .
- 3: , , 24.
: . API GET /v1/orders
. , . If-Match , . (, , ). , . () , , « , ». , . , ( ), : , , fingerprint
Google Cloud API .
, API . .
, API 404. , API .
DELETE /v1/orders/:id. . soft delete ( deleted_at=now()) .
, . , , 404: . « ».
, API , , — .
200 , DELETE . . soft delete API :
- , id;
- , n ( , ), 200;
- 410 « ». 404 410 , 404 , , . 410 , , .
.
B
, API : , API.

B. PATCH /v1/orders/:id
:
{
"to": " "
}
update
:
UPDATE orders SET to={to} WHERE id={id}
— . , / , .
API : , . API , . - . API
UPDATE user_counters SET orders_finished = {orders_finished+1} WHERE user_id={user_id}
, API , 1.

: , ? , -, , -, API, .
- :
- ;
- , , ;
- API : API , .
: ? , . .
-, , API . , ?
SMS
: , - SMS. , .

SMS: , SMS . , . , ? , consumer . : , , .
: , SMS, email , : . , "at least once delivery" "at most once delivery". , , , .
, , API . , .
. API. . . . - API. - , , , API . , . , .
, , , ? , . : , . . .