使用消息处理框架发布 Amazon 消息,适用于. NET - Amazon SDK for .NET
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用消息处理框架发布 Amazon 消息,适用于. NET

这是适用于预览版中功能的预发布文档。本文档随时可能更改。

的 Amazon 消息处理框架. NET支持发布一种或多种消息类型、处理一种或多种消息类型,或者在同一个应用程序中同时处理这两种消息类型。

以下代码显示了向不同 Amazon 服务发布不同消息类型的应用程序的配置。

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。 NETMVC控制器接收来自用户的ChatMessage消息和OrderInfo事件,然后SNS分别将其发布到 Amazon SQS 和 Amazon。两种消息类型都可以使用上面配置的通用发布器发布。

[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,它可以根据配置的消息类型发布到任何支持的 Amazon 服务。该框架还为亚马逊SQS、亚马逊SNS和亚马逊 EventBridge提供特定服务的出版商。这些特定的发布者公开的选项仅适用于该服务,并且可以使用ISQSPublisherISNSPublisher、和类型进行注入IEventBridgePublisher

例如,向SQSFIFO队列发送消息时,必须设置相应的消息组 ID。以下代码再次显示了该ChatMessage示例,但现在使用ISQSPublisher来设置SQS特定选项。

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(); } }

可以对和 EventBridge、IEventBridgePublisher分别使用SNSISNSPublisher和进行同样的操作。

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> });

默认情况下,给定类型的消息会发送到预先配置的目的地。但是,您可以使用特定于消息的发布者来覆盖单条消息的目的地。您还可以覆盖用于发布消息的底层 Amazon SDK for .NET 客户端,这在需要根据目标更改角色或凭据的多租户应用程序中非常有用。

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