.NET용 AWS 메시지 처리 프레임워크를 사용하여 메시지 게시 - AWS SDK for .NET

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

.NET용 AWS 메시지 처리 프레임워크를 사용하여 메시지 게시

이 시험판 설명서는 프리뷰 릴리즈의 기능에 관한 것입니다. 내용은 변경될 수 있습니다.

.NET용 AWS 메시지 처리 프레임워크는 하나 이상의 메시지 유형을 게시하거나, 하나 이상의 메시지 유형을 처리하거나, 동일한 응용 프로그램에서 두 가지 작업을 모두 수행할 수 있도록 지원합니다.

다음 코드는 서로 다른 메시지 유형을 서로 다른 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 를 각각 사용하여 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> });

기본적으로 지정된 유형의 메시지는 미리 구성된 대상으로 전송됩니다. 하지만 메시지별 게시자를 사용하여 단일 메시지의 대상을 재정의할 수 있습니다. 메시지를 게시하는 데 사용되는 기본 AWS SDK for .NET 클라이언트를 재정의할 수도 있습니다. 이는 대상에 따라 역할이나 자격 증명을 변경해야 하는 멀티 테넌트 응용 프로그램에서 유용할 수 있습니다.

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