冪等性
同じ操作を何度実行しても結果が変わらない性質で、分散システムの信頼性を支える
分散システムAPI
冪等性とは
冪等性 (Idempotency) は、同じ操作を何度実行しても結果が変わらない性質である。ネットワーク障害でリトライが発生する分散システムでは、冪等性がないと二重処理 (二重課金、二重注文) が発生する。
HTTP メソッドの冪等性
| メソッド | 冪等 | 安全 | 説明 |
|---|---|---|---|
| GET | ✅ | ✅ | 何度取得しても同じ結果 |
| PUT | ✅ | ❌ | 同じデータで何度更新しても同じ状態 |
| DELETE | ✅ | ❌ | 既に削除済みなら何も起きない |
| POST | ❌ | ❌ | 実行するたびに新しいリソースが作成される |
| PATCH | ❌ | ❌ | 操作内容による |
POST を冪等にする: 冪等キー
// クライアントが一意の冪等キーを生成
const idempotencyKey = crypto.randomUUID();
fetch('/api/orders', {
method: 'POST',
headers: { 'Idempotency-Key': idempotencyKey },
body: JSON.stringify({ productId: 'P1', quantity: 2 }),
});
DynamoDB の条件付き書き込み
// 冪等な書き込み: 同じ orderId で 2 回実行しても 1 件だけ作成
await db.put({
TableName: 'orders',
Item: { orderId, ...orderData },
ConditionExpression: 'attribute_not_exists(orderId)', // 既に存在したらエラー
});
Lambda Powertools の Idempotency
import { makeIdempotent } from '@aws-lambda-powertools/idempotency';
const processOrder = makeIdempotent(async (event) => {
return await createOrder(event);
}, { persistenceStore: new DynamoDBPersistenceLayer({ tableName: 'idempotency' }) });
冪等でない操作の危険性
1. クライアントが POST /orders を送信
2. サーバーが注文を作成、レスポンスを返す途中でネットワーク障害
3. クライアントはレスポンスを受け取れず、リトライ
4. サーバーが同じ注文をもう 1 件作成 → 二重注文!
理論と実装の両面から学ぶなら関連書籍が参考になる。