Idempotence - cela semble compliqué, ils en parlent rarement, mais cela s'applique à toutes les applications qui utilisent l'API dans leur travail.
Je m'appelle Denis Isaev et je dirige l'un des groupes backend sur Yandex.Taxi. Aujourd'hui, je partagerai avec les lecteurs Habr une description des problèmes qui peuvent survenir si vous ne tenez pas compte de l'idempotence des systèmes distribués dans mon projet. Pour ce faire, j'ai choisi le format des histoires fictives sur le stagiaire Vasya, qui apprend juste à travailler avec l'API. Ce sera plus visuel et utile. Allons-y.

À propos de l'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 . , . , .
, , , ? , . : , . . .