質問: 現在ゲームのAPIを作っています。クライアントはスマフォで、サーバのAPIを叩く形です。 ここで、クライアントがサーバからのレスポンスを受け取れなかった場合の処理をどうするかで悩んでいます。 例えば、クライアントがガチャを引くAPIを叩いたとします。 するとサーバ側は、クライアントのゴールドなどを引き抜き、ガチャの判定を行い、出たカードのレスポンスを返します。 しかしここでクライアントの通信状況が悪く、このレスポンスを取得できなかったとします。 この時にクライアントはサーバでガチャの処理が失敗したのか、成功したのか。 また成功したのならどんなカードがゲットできたのか。 これらの情報をどうやって取得するのか?という問題が発生すると思っています。 これはガチャのみならず全ての更新系の通信に言えることだと思います。 どのようにすればこの問題を解決できるでしょうか? ご回答をいただけると幸いです。
回答: クライアントの都合もありますので、あらゆるケースで対応可能なAPI設計にすることは難しいですが、一例を述べます。 簡単に述べると、「HTTPリクエストヘッダーにクライアントからトランザクションIDを付与し、レスポンスが返ってこない場合にはリトライする」です。 以下、詳細を述べます。 どのような値でも良いのですが、クライアント側が更新APIの個々のリクエストに対して識別できるようなIDをHTTPリクエストヘッダーに付与します。 サーバー側の更新APIでは、正常処理が終了後、渡されたトランザクションIDをキーとして、返すべきレスポンスをキャッシュしておきます。 クライアント側がサーバーからのレスポンスを受け取る事ができなかった場合、同じトランザクションIDで同じ更新APIをリクエストします。 サーバー側は、渡されたトランザクションIDに該当する結果がキャッシュに残っているので、既に処理済みとして、キャッシュされたレスポンスを返します。 HTTPリクエストヘッダーに付与するトランザクションIDですが、ご質問ではゲームということですから、サーバー側がログインまたは更新APIのレスポンス返却時に生成する方がよいかもしれません。 また、リトライリクエストであることを表すようなHTTPリクエストヘッダー(例えばリトライ回数)を付与するようにすれば、サーバー側でのリトライか否かの判定が楽になります。