AWS Message Processing Framework for .NET を使用してメッセージを発行する - AWS SDK for .NET

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

AWS Message Processing Framework for .NET を使用してメッセージを発行する

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

Message AWS Processing Framework for .NET では、1 つ以上のメッセージタイプの公開、1 つ以上のメッセージタイプの処理、または同じアプリケーションでのその両方の実行がサポートされています。

次のコードは、異なるメッセージタイプを異なる AWS サービスに発行するアプリケーションの設定を示しています。

var builder = WebApplication.CreateBuilder(args); // Register the AWS Message Processing Framework for .NET builder.Services.AddAWSMessageBus(builder => { // Register that you'll send messages of type ChatMessage to an existing queue builder.AddSQSPublisher<ChatMessage>("https://sqs.us-west-2.amazonaws.com/012345678910/MyAppProd"); // Register that you'll publish messages of type OrderInfo to an existing SNS topic builder.AddSNSPublisher<OrderInfo>("arn:aws:sns:us-west-2:012345678910:MyAppProd"); // Register that you'll publish messages of type FoodItem to an existing EventBridge bus builder.AddEventBridgePublisher<FoodItem>("arn:aws:events:us-west-2:012345678910:event-bus/default"); });

起動時にフレームワークを登録したら、汎用 をコードIMessagePublisherに挿入します。PublishAsync メソッドを呼び出して、上記で設定したメッセージタイプを発行します。汎用パブリッシャーは、そのタイプに基づいて、メッセージのルーティング先を決定します。

次の例では、ASP.NET MVC コントローラーはユーザーからChatMessageメッセージとOrderInfoイベントの両方を受信し、それぞれ Amazon SQS と Amazon SNS に発行します。どちらのメッセージタイプも、上記で設定した汎用パブリッシャーを使用して発行できます。

[ApiController] [Route("[controller]")] public class PublisherController : ControllerBase { private readonly IMessagePublisher _messagePublisher; public PublisherController(IMessagePublisher messagePublisher) { _messagePublisher = messagePublisher; } [HttpPost("chatmessage", Name = "Chat Message")] public async Task<IActionResult> PublishChatMessage([FromBody] ChatMessage message) { // Perform business and validation logic on the ChatMessage here. if (message == null) { return BadRequest("A chat message was not submitted. Unable to forward to the message queue."); } if (string.IsNullOrEmpty(message.MessageDescription)) { return BadRequest("The MessageDescription cannot be null or empty."); } // Send the ChatMessage to SQS, using the generic publisher. await _messagePublisher.PublishAsync(message); return Ok(); } [HttpPost("order", Name = "Order")] public async Task<IActionResult> PublishOrder([FromBody] OrderInfo message) { if (message == null) { return BadRequest("An order was not submitted."); } // Publish the OrderInfo to SNS, using the generic publisher. await _messagePublisher.PublishAsync(message); return Ok(); } }

メッセージを適切な処理ロジックにルーティングするために、フレームワークはメッセージタイプ識別子 と呼ばれるメタデータを使用します。デフォルトでは、これはアセンブリ名を含むメッセージの .NET タイプのフルネームです。メッセージの送信と処理の両方を行う場合、このメカニズムは、プロジェクト間でメッセージオブジェクトの定義を共有するとうまく機能します。ただし、メッセージが別の名前空間で再定義されている場合、またはメッセージを他のフレームワークやプログラミング言語と交換する場合は、メッセージタイプ識別子を上書きする必要がある場合があります。

var builder = Host.CreateDefaultBuilder(args); builder.ConfigureServices(services => { // Register the AWS Message Processing Framework for .NET services.AddAWSMessageBus(builder => { // Register that you'll publish messages of type GreetingMessage to an existing queue builder.AddSQSPublisher<GreetingMessage>("https://sqs.us-west-2.amazonaws.com/012345678910/MyAppProd", "greetingMessage"); }); });

サービス固有のパブリッシャー

上記の例では、汎用 を使用しています。汎用 はIMessagePublisher、設定されたメッセージタイプに基づいて、サポートされている任意の AWS サービスに発行できます。このフレームワークは、Amazon SQS、Amazon SNS、Amazon のサービス固有のパブリッシャーも提供します EventBridge。これらの特定のパブリッシャーは、そのサービスにのみ適用され、タイプ ISQSPublisher、、ISNSPublisherおよび を使用して挿入できるオプションを公開しますIEventBridgePublisher

例えば、SQS FIFO キューにメッセージを送信する場合は、適切なメッセージグループ ID を設定する必要があります。次のコードはChatMessage例を再度示していますが、現在は を使用して SQS 固有のオプションISQSPublisherを設定しています。

public class PublisherController : ControllerBase { private readonly ISQSPublisher _sqsPublisher; public PublisherController(ISQSPublisher sqsPublisher) { _sqsPublisher = sqsPublisher; } [HttpPost("chatmessage", Name = "Chat Message")] public async Task<IActionResult> PublishChatMessage([FromBody] ChatMessage message) { // Perform business and validation logic on the ChatMessage here if (message == null) { return BadRequest("A chat message was not submitted. Unable to forward to the message queue."); } if (string.IsNullOrEmpty(message.MessageDescription)) { return BadRequest("The MessageDescription cannot be null or empty."); } // Send the ChatMessage to SQS using the injected ISQSPublisher, with SQS-specific options await _sqsPublisher.SendAsync(message, new SQSOptions { DelaySeconds = <delay-in-seconds>, MessageAttributes = <message-attributes>, MessageDeduplicationId = <message-deduplication-id>, MessageGroupId = <message-group-id> }); return Ok(); } }

SNS と では EventBridge、IEventBridgePublisherそれぞれ ISNSPublisherと を使用して同じことができます。

await _snsPublisher.PublishAsync(message, new SNSOptions { Subject = <subject>, MessageAttributes = <message-attributes>, MessageDeduplicationId = <message-deduplication-id>, MessageGroupId = <message-group-id> });
await _eventBridgePublisher.PublishAsync(message, new EventBridgeOptions { DetailType = <detail-type>, Resources = <resources>, Source = <source>, Time = <time>, TraceHeader = <trace-header> });

デフォルトでは、特定のタイプのメッセージが、事前に設定された送信先に送信されます。ただし、メッセージ固有のパブリッシャーを使用して、1 つのメッセージの送信先を上書きできます。また、メッセージの発行に使用される基盤となる AWS SDK for .NET クライアントをオーバーライドすることもできます。これは、送信先に応じてロールまたは認証情報を変更する必要があるマルチテナントアプリケーションで役立ちます。

await _sqsPublisher.SendAsync(message, new SQSOptions { OverrideClient = <override IAmazonSQS client>, QueueUrl = <override queue URL> });