Message AWS Processing Framework for .NET でメッセージを消費する - AWS SDK for .NET

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Message AWS Processing Framework for .NET でメッセージを消費する

これはプレビューリリースの機能に関するプレリリースドキュメントです。このドキュメントは変更される可能性があります。

Message AWS Processing Framework for .NET では、フレームワークまたはメッセージングサービスのいずれかを使用して発行されたメッセージを消費できます。メッセージはさまざまな方法で消費できます。そのいくつかを以下に示します。

メッセージハンドラー

メッセージを使用するには、処理するメッセージタイプごとに IMessageHandlerインターフェイスを使用してメッセージハンドラーを実装します。メッセージタイプとメッセージハンドラー間のマッピングは、プロジェクトの起動時に設定されます。

await Host.CreateDefaultBuilder(args) .ConfigureServices(services => { // Register the AWS Message Processing Framework for .NET services.AddAWSMessageBus(builder => { // Register an SQS Queue that the framework will poll for messages. // NOTE: The URL given below is an example. Use the appropriate URL for your SQS Queue. builder.AddSQSPoller("https://sqs.us-west-2.amazonaws.com/012345678910/MyAppProd"); // Register all IMessageHandler implementations with the message type they should process. // Here messages that match our ChatMessage .NET type will be handled by our ChatMessageHandler builder.AddMessageHandler<ChatMessageHandler, ChatMessage>(); }); }) .Build() .RunAsync();

次のコードは、メッセージのChatMessageメッセージハンドラーの例を示しています。

public class ChatMessageHandler : IMessageHandler<ChatMessage> { public Task<MessageProcessStatus> HandleAsync(MessageEnvelope<ChatMessage> messageEnvelope, CancellationToken token = default) { // Add business and validation logic here. if (messageEnvelope == null) { return Task.FromResult(MessageProcessStatus.Failed()); } if (messageEnvelope.Message == null) { return Task.FromResult(MessageProcessStatus.Failed()); } ChatMessage message = messageEnvelope.Message; Console.WriteLine($"Message Description: {message.MessageDescription}"); // Return success so the framework will delete the message from the queue. return Task.FromResult(MessageProcessStatus.Success()); } }

外部には、フレームワークで使用されるメタデータMessageEnvelopeが含まれています。そのmessageプロパティはメッセージタイプです (この場合は ChatMessage)。

MessageProcessStatus.Success() に戻って、メッセージが正常に処理され、フレームワークが Amazon SQS キューからメッセージを削除することを示すことができます。を返すとMessageProcessStatus.Failed()、メッセージはキューに留まり、再度処理するか、設定されている場合はデッドレターキューに移動できます。

長時間実行されるプロセスでのメッセージの処理

SQS キュー URL AddSQSPollerを使用して を呼び出すと、キューBackgroundServiceを継続的にポーリングしてメッセージを処理する長時間実行を開始できます。

await Host.CreateDefaultBuilder(args) .ConfigureServices(services => { // Register the AWS Message Processing Framework for .NET services.AddAWSMessageBus(builder => { // Register an SQS Queue that the framework will poll for messages. // NOTE: The URL given below is an example. Use the appropriate URL for your SQS Queue. builder.AddSQSPoller("https://sqs.us-west-2.amazonaws.com/012345678910/MyAppProd", options => { // The maximum number of messages from this queue that the framework will process concurrently on this client. options.MaxNumberOfConcurrentMessages = 10; // The duration each call to SQS will wait for new messages. options.WaitTimeSeconds = 20; }); // Register all IMessageHandler implementations with the message type they should process. builder.AddMessageHandler<ChatMessageHandler, ChatMessage>(); }); }) .Build() .RunAsync();

SQS メッセージポーラーの設定

SQS メッセージポーラーは、 を呼び出すSQSMessagePollerOptionsときに で設定できますAddSQSPoller

  • MaxNumberOfConcurrentMessages - キューから同時に処理できるメッセージの最大数。デフォルト値は 10 です。

  • WaitTimeSeconds - SQS ReceiveMessage 呼び出しがメッセージがキューに到着するまで待機してから戻る時間 (秒単位)。メッセージが利用可能な場合、呼び出しは よりも早く返されますWaitTimeSeconds。デフォルト値は 20 です。

メッセージの可視性タイムアウト処理

SQS メッセージには可視性タイムアウト期間があります。1 つのコンシューマーが特定のメッセージの処理を開始すると、そのコンシューマーはキューに留まりますが、他のコンシューマーからは複数回処理されないように非表示になります。再び表示される前にメッセージが処理および削除されない場合、別のコンシューマーが同じメッセージの処理を試みる可能性があります。

このフレームワークは、現在処理中のメッセージの可視性タイムアウトを追跡して延長しようとします。この動作は、 を呼び出すSQSMessagePollerOptionsときに で設定できますAddSQSPoller

  • VisibilityTimeout - 受信したメッセージの秒単位の期間は、後続の取得リクエストでは非表示になります。デフォルト値は 30 です。

  • VisibilityTimeoutExtensionThreshold - メッセージの可視性タイムアウトがこの数秒以内に期限切れになると、フレームワークは可視性タイムアウトを (別のVisibilityTimeout秒) 延長します。デフォルト値は 5 です。

  • VisibilityTimeoutExtensionHeartbeatInterval - フレームワークが期限切れから数秒以内にメッセージをチェックし、可視性タイムアウトを延長するVisibilityTimeoutExtensionThreshold秒単位の頻度。デフォルト値は 1 です。

次の例では、フレームワークは 1 秒ごとにまだ処理中のメッセージをチェックします。再び表示されてから 5 秒以内のメッセージの場合、フレームワークは各メッセージの可視性タイムアウトをさらに 30 秒延長します。

// NOTE: The URL given below is an example. Use the appropriate URL for your SQS Queue. builder.AddSQSPoller("https://sqs.us-west-2.amazonaws.com/012345678910/MyAppProd", options => { options.VisibilityTimeout = 30; options.VisibilityTimeoutExtensionThreshold = 5; VisibilityTimeoutExtensionHeartbeatInterval = 1; });

AWS Lambda 関数でのメッセージの処理

Message AWS Processing Framework for .NET は、SQS と Lambda の統合で使用できます。これは AWS.Messaging.Lambdaパッケージによって提供されます。開始するには、README を参照してください。