Event Grid によるメッセージの配信と再試行Event Grid message delivery and retry

この記事では、配信が確認されないときに Azure Event Grid がイベントをどのように処理するかについて説明します。This article describes how Azure Event Grid handles events when delivery isn't acknowledged.

Event Grid は、持続性のある配信を提供します。Event Grid provides durable delivery. 各サブスクリプションに対して、最低 1 回は各メッセージを配信します。It delivers each message at least once for each subscription. イベントは、直ちに各サブスクリプションの登録済みのエンドポイントに送信されます。Events are sent to the registered endpoint of each subscription immediately. エンドポイントがイベントの受信を確認しない場合、Event Grid はイベントの配信を再試行します。If an endpoint doesn't acknowledge receipt of an event, Event Grid retries delivery of the event.

現時点では、Event Grid はサブスクライバーへ各イベントを個別に送信します。Currently, Event Grid sends each event individually to subscribers. サブスクライバーは、イベント 1 つが格納された配列を受け取ります。The subscriber receives an array with a single event.

再試行のスケジュールと期間Retry schedule and duration

Event Grid は、メッセージの配信後、応答を 30 秒間待機します。Event Grid waits 30 seconds for a response after delivering a message. 30 秒経過しても、エンドポイントが応答していない場合は、メッセージは再試行のためにキューに入れられます。After 30 seconds, if the endpoint hasn’t responded, the message is queued for retry. Event Grid は、イベント配信に対して指数バックオフ再試行ポリシーを使用します。Event Grid uses an exponential backoff retry policy for event delivery. Event Grid ではベスト エフォート方式で次のスケジュールに従って配信を再試行します。Event Grid retries delivery on the following schedule on a best effort basis:

  • 10 秒10 seconds
  • 30 秒30 seconds
  • 1 分1 minute
  • 5 分5 minutes
  • 10 分10 minutes
  • 30 分30 minutes
  • 1 時間1 hour
  • 最大24 時間で、1時間ごとHourly for up to 24 hours

エンドポイントが 3 分以内に応答した場合、Event Grid はベスト エフォート方式でイベントを再試行キューから削除しようとしますが、それでも重複が受信される可能性があります。If the endpoint responds within 3 minutes, Event Grid will attempt to remove the event from the retry queue on a best effort basis but duplicates may still be received.

Event Grid では、すべての再試行の手順に小規模なランダム化を追加します。また、エンドポイントが一貫して正常ではない、長期間ダウンしている、または圧迫されていることがわかっている場合は、状況に応じて、特定の再試行をスキップできます。Event Grid adds a small randomization to all retry steps and may opportunistically skip certain retries if an endpoint is consistently unhealthy, down for a long period, or appears to be overwhelmed.

決定論的な動作の場合は、サブスクリプション再試行ポリシーの中で有効なイベント タイムと最大配信試行回数を設定します。For deterministic behavior, set the event time to live and max delivery attempts in the subscription retry policies.

Event Grid では、既定で 24 時間内に配信されないすべてのイベントが有効期限切れになります。By default, Event Grid expires all events that aren't delivered within 24 hours. イベント サブスクリプションの作成時には、再試行ポリシーをカスタマイズすることができます。You can customize the retry policy when creating an event subscription. 配信の最大試行回数 (既定値は 30) と、イベントの有効期限 (既定値は 1,440 分) を指定します。You provide the maximum number of delivery attempts (default is 30) and the event time-to-live (default is 1440 minutes).

遅延配信Delayed Delivery

エンドポイントで配信エラーが発生すると、Event Grid はそのエンドポイントへのイベント配信とイベントの再試行を遅らせ始めます。As an endpoint experiences delivery failures, Event Grid will begin to delay the delivery and retry of events to that endpoint. たとえば、エンドポイントに発行された最初の 10 個のイベントが失敗した場合、Event Grid はそのエンドポイントで問題が発生していると想定し、その後の再試行と新しい配信をしばらく (場合によっては数時間) 遅らせます。For example, if the first ten events published to an endpoint fail, Event Grid will assume that the endpoint is experiencing issues and will delay all subsequent retries and new deliveries for some time - in some cases up to several hours.

遅延配信の機能的な目的は、Event Grid システムに加えて、正常でないエンドポイントを保護することです。The functional purpose of delayed delivery is to protect unhealthy endpoints as well as the Event Grid system. バックオフや、正常でないエンドポイントへの配信遅延がなければ、Event Grid の再試行ポリシーとボリューム機能によってシステムがすぐに過負荷になる可能性があります。Without back-off and delay of delivery to unhealthy endpoints, Event Grid's retry policy and volume capabilities can easily overwhelm a system.

配信不能イベントDead-letter events

Event Grid がイベントを配信できない場合は、配信不能イベントをストレージ アカウントに送信できます。When Event Grid can't deliver an event, it can send the undelivered event to a storage account. このプロセスは配信不能処理と呼ばれます。This process is known as dead-lettering. 既定では、Event Grid は配信不能処理を有効にしません。By default, Event Grid doesn't turn on dead-lettering. この処理を有効にするには、イベント サブスクリプションの作成時に、配信不能イベントを保持するようにストレージ アカウントを指定する必要があります。To enable it, you must specify a storage account to hold undelivered events when creating the event subscription. このストレージ アカウントからイベントをプルして配信を解決します。You pull events from this storage account to resolve deliveries.

Event Grid は、そのすべての再試行を試行し終わると、配信不能の場所にイベントを送信します。Event Grid sends an event to the dead-letter location when it has tried all of its retry attempts. Event Grid は、400 (正しくない要求) または 413 (要求のエンティティが大きすぎます) の応答コードを受信した場合、直ちにそのイベントを配信不能エンドポイントに送信します。If Event Grid receives a 400 (Bad Request) or 413 (Request Entity Too Large) response code, it immediately sends the event to the dead-letter endpoint. これらの応答コードは、イベントの配信が決して成功しないことを示します。These response codes indicate delivery of the event will never succeed.

イベントの配信を最後に試してから配信不能メッセージがその宛先に届くまで、5 分間の遅延があります。There is a five-minute delay between the last attempt to deliver an event and when it is delivered to the dead-letter location. この遅延の目的は、BLOB ストレージの操作数を減らすことにあります。This delay is intended to reduce the number Blob storage operations. 配信不能の場所が 4 時間にわたって使用できない場合、そのイベントは破棄されます。If the dead-letter location is unavailable for four hours, the event is dropped.

配信不能の場所を設定するには、コンテナーを含むストレージ アカウントが必要です。Before setting the dead-letter location, you must have a storage account with a container. イベント サブスクリプションの作成時に、このコンテナーのエンドポイントを指定します。You provide the endpoint for this container when creating the event subscription. エンドポイントの形式は次のとおりです。/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Storage/storageAccounts/<storage-name>/blobServices/default/containers/<container-name>The endpoint is in the format of: /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Storage/storageAccounts/<storage-name>/blobServices/default/containers/<container-name>

イベントが配信不能の場所に送信されたら通知を受け取るようにすることもできます。You might want to be notified when an event has been sent to the dead letter location. Event Grid を使用して配信不能イベントに応答するには、配信不能 Blob ストレージ用のイベント サブスクリプションを作成します。To use Event Grid to respond to undelivered events, create an event subscription for the dead-letter blob storage. 配信不能 Blob ストレージが配信不能イベントを受信するたびに、Event Grid はハンドラーに通知します。Every time your dead-letter blob storage receives an undelivered event, Event Grid notifies your handler. ハンドラーは、配信不能イベントを調整するためのアクションで応答します。The handler responds with actions you wish to take for reconciling undelivered events.

配信不能の場所の設定の例については、「配信不能と再試行に関する方針」を参照してください。For an example of setting up a dead letter location, see Dead letter and retry policies.

メッセージの配信状態Message delivery status

Event Grid は、HTTP 応答コードを使用してイベントの受信を確認します。Event Grid uses HTTP response codes to acknowledge receipt of events.

成功コードSuccess codes

Event Grid は、次の HTTP 応答コードのみを正常な配信と見なします。Event Grid considers only the following HTTP response codes as successful deliveries. その他のすべてのステータス コードは配信失敗と見なされ、必要に応じて再試行されるか、配信不能とされます。All other status codes are considered failed deliveries and will be retried or deadlettered as appropriate. 正常なステータス コードを受信したら、Event Grid は配信が完了したと見なします。Upon receiving a successful status code, Event Grid considers delivery complete.

  • 200 OK200 OK
  • 201 Created201 Created
  • 202 受理されました202 Accepted
  • 203 権限のない情報203 Non-Authoritative Information
  • 204 No Content204 No Content

エラー コードFailure codes

上記のセット (200 ~ 204) にない他のすべてのコードはエラーと見なされ、再試行されます。All other codes not in the above set (200-204) are considered failures and will be retried. 一部には、以下で説明するように特定の再試行ポリシーが関連付けられていますが、他はすべて標準の指数的バックオフ モデルに従います。Some have specific retry policies tied to them outlined below, all others follow the standard exponential back-off model. 重要な注意点としては、Event Grid のアーキテクチャは高度に並列化されているため、再試行の動作は非決定的です。It's important to keep in mind that due to the highly parallelized nature of Event Grid's architecture, the retry behavior is non-deterministic.

status codeStatus code 再試行の動作Retry behavior
400 Bad Request400 Bad Request 5 分以上経過してから再試行 (配信不能セットアップの場合は直ちに配信不能)Retry after 5 minutes or more (Deadletter immediately if deadletter setup)
401 権限がありません401 Unauthorized 5 分以上後に再試行Retry after 5 minutes or more
403 許可されていません403 Forbidden 5 分以上後に再試行Retry after 5 minutes or more
404 見つかりません404 Not Found 5 分以上後に再試行Retry after 5 minutes or more
408 要求タイムアウト408 Request Timeout 2 分以上後に再試行Retry after 2 minutes or more
413 要求のエンティティが大きすぎます413 Request Entity Too Large 10 秒以上経過してから再試行 (配信不能セットアップの場合は直ちに配信不能)Retry after 10 seconds or more (Deadletter immediately if deadletter setup)
503 サービス利用不可503 Service Unavailable 30 秒以上後に再試行Retry after 30 seconds or more
その他すべてAll others 10 秒以上後に再試行Retry after 10 seconds or more

次の手順Next steps