适用于 .NET 的 Amazon SDK 版本 4(V4)已经发布!
要开始使用新版本的 SDK,请参阅 适用于 .NET 的 Amazon SDK(V4)开发人员指南,尤其是关于迁移到版本 4 的主题。
使用 Amazon Message Processing Framework for .NET 发布消息
Amazon Message Processing Framework for .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.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,它可以根据配置的消息类型发布到任何支持的 Amazon 服务。该框架还为 Amazon SQS、Amazon SNS 和 Amazon EventBridge 提供特定于服务的发布者。这些特定的发布者会显示仅适用于特定服务的选项,并且这些选项可以使用类型 ISQSPublisher、ISNSPublisher 和 IEventBridgePublisher 完成注入。
例如,向 SQS FIFO 队列发送消息时,您必须设置相应的消息组 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(); } }
对于 SNS 和 EventBridge,也可以分别使用 ISNSPublisher 和 IEventBridgePublisher 来完成同样的操作。
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> });
默认情况下,给定类型的消息会发送到预先配置的目的地。但是,您可以使用特定于消息的发布者来覆盖单条消息的目的地。您还可以覆盖用于发布消息的底层 适用于 .NET 的 Amazon SDK 客户端,这在需要根据目的地更改角色或凭证的多租户应用程序中非常有用。
await _sqsPublisher.SendAsync(message, new SQSOptions { OverrideClient = <override IAmazonSQS client>, QueueUrl = <override queue URL> });