AWS Message Processing Framework for .NET でメッセージを使用する - AWS SDK for .NET (V3)

のバージョン 4 (V4) AWS SDK for .NET がリリースされました。

SDK の新しいバージョンの使用を開始するには、「AWS SDK for .NET (V4) デベロッパーガイド」、特に「バージョン 4 への移行」に関するトピックを参照してください。

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

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

AWS Message 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 メッセージポーラーは、AddSQSPoller を呼び出すときに SQSMessagePollerOptions によって設定できます。

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

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

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

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

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

  • 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関数でのメッセージの処理

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