すべてのプロダクト
Search
ドキュメントセンター

Elastic Compute Service:べき等性を確保する方法

最終更新日:Dec 17, 2024

Elastic Compute Service (ECS) APIを呼び出すときにリクエストタイムアウトまたは内部サーバーエラーが発生した場合、クライアントはリクエストの再送信を試みる可能性があります。 この場合、クライアントがリクエストを繰り返し送信しないように、リクエストにClientTokenパラメーターを指定できます。

べき等とは何ですか?

等価性は、数学およびコンピュータサイエンスにおけるいくつかの操作またはリソースの特性です。 これは、送信されるリクエストの数に関係なく、操作またはリソースが同じ結果につながることを意味します。 等価性は、分散システム設計において重要な役割を果たす。

べき等性を確保する

通常、クライアントは、エラー500 (InternalError) または503 (ServiceUnavailable) が返された場合、または応答が受信されなかった場合にのみ、リクエストを再試行する必要があります。 Alibaba Cloud ECS APIを使用すると、クライアントは最大64 ASCII文字で構成されるパラメーター値を生成します。この値をClientTokenに割り当てて、再試行されたリクエストのべき等性を確保できます。

ClientTokenの詳細

次のセクションでは、ClientTokenの詳細について説明します。

  • ClientToken値は、クライアントによって生成される一意で大文字と小文字を区別する文字列で、長さは最大64のASCII文字を含めることができます。 例: ClientToken=123e4567-e89b-12d3-a456-426655440000

  • 使用中のClientToken値で異なるリクエストパラメーターを指定した場合、ECSはIdempotentParameterMismatchエラーコードを返します。 ClientTokenの値を変更して再試行できます。

  • ClientToken値を再利用し、リクエスト内の他のパラメーターを変更しないと、クライアントはリクエストが最初に送信されたときと同じ応答を受け取ります。これは、サーバー側のECSインスタンスのステータスには影響しません。

    説明

    APIリクエストを再試行するときは、SignatureNonceTimestamp、およびSignatureの値を変更する必要があります。 これは、ECSがSignatureNonceを使用して各リクエストが一意であることを確認し、リプレイ攻撃を防止し、Timestampを使用して各リクエストのタイムスタンプを記録するためです。 したがって、再試行されたリクエストには、異なるSignatureNonce値とTimestamp値を指定する必要があります。 その結果、Signatureの値が変更されます。

  • 再試行されたリクエストにClientTokenパラメーターを追加した後:

    • HTTPステータスコードの200が返された場合、再試行によって前回のリクエストと同じ結果が生成され、サーバーのステータスは影響を受けません。

    • HTTPステータスコード4xxが返された場合、再試行は失敗します。 ステータスコードがtry it laterエラーメッセージとともに返された場合、サーバーはビジー状態です。 しばらくしてからもう一度お試しください。 リクエストを再送信する前に、返されたエラーメッセージに基づいて問題をトラブルシューティングする必要があります。

べき等値要求のサンプル

たとえば、RunInstance操作を呼び出してECSインスタンスを作成したとします。 他のリクエストパラメーターを変更せずに同じClientToken値を使用すると、サーバーは同じレスポンスを返し、InstanceId値を1つだけ生成します。 インスタンスリソースが不足してインスタンスを作成できない場合は、リソース不足の問題を解決し、ClientToken値を変更してからインスタンスを作成します。

https://ecs.aliyuncs.com/?Action=RunInstances
&RegionId=cn-hangzhou
&InstanceType=ecs.cm4.6xlarge
&ImageId=win2008r2_64_ent_sp1_en-us_40G_alibase_20170915.vhd
&SecurityGroupId=sg-securitygroupid
&Amount=1
.......
&ClientToken=123e4567-e89b-12d3-a456-426655440000
&<Common request parameters>

ClientTokenを使用しない場合、エラー発生後にクライアントが操作を再試行するときに、複数のECSインスタンスが作成される可能性があります。

API 操作