冪等性を優先する
クライアントで再試行する可能性があります。
再試行結果が変わる場合、ユーザーに驚かれるかもしれません。
重複する書き込みを回避する簡単な方法は、
サーバーで重複排除されるクライアント作成のリクエスト ID を指定できるようにすることです(たとえば、コンテンツのハッシュまたは UUID)。
// bad: 重複したitemが作成される可能性があります
message CreateItemRequest {
string name = 2;
string price = 3;
}
// good: hash で重複を回避するサーバー側の処理を想定
message CreateItemRequest {
string hash = 1;
string name = 2;
string price = 3;
}
ストレージのUK制約を使うことも考えられますが、このような手法でBFFなどのサーバー側のみで重複排除することもあります。
Request内容のhashをサーバで作成して、Redisなどで重複排除するケースなども出来そうですが、
冪等性を期待するかどうかはAPIの仕様によると思いますので、明示的にRequestに冪等性を担保する情報を持たせる手法は有用かもしれません。