큐를 사용해 메시지를 보내고 받는 코드 작성
분산 애플리케이션은 대상 구성 요소로 배달 대기 중인 메시지의 임시 스토리지 위치로 Service Bus 큐를 사용합니다. 큐를 통해 메시지를 전송하고 수신하려면 원본 구성 요소와 대상 구성 요소 모두에서 코드를 작성해야 합니다.
Contoso Bicycles 애플리케이션의 예를 고려해 보겠습니다. 고객은 웹사이트 또는 모바일 앱을 통해 주문을 할 수 있습니다. 웹 사이트와 모바일 앱은 고객 디바이스에서 실행되므로 동시에 접수될 수 있는 주문 수에는 실제로 제한이 없습니다. 모바일 앱과 웹사이트가 Service Bus 큐에 주문을 보관하도록 하여 백 엔드 구성 요소(웹 앱)는 해당 큐에서 적절한 속도로 주문을 처리할 수 있습니다.
실제로 Contoso Bicycles 애플리케이션은 몇 단계를 거쳐 새 주문을 처리합니다. 모든 단계를 수행하려면 먼저 결제가 승인되어야 하므로 큐를 사용하도록 하겠습니다. 수신 구성 요소에서는 먼저 결제를 처리합니다.
Contoso는 모바일 앱과 웹 사이트에서 메시지를 큐에 추가하는 코드를 작성해야 합니다. 백 엔드 웹앱에서 Contoso는 메시지를 큐에서 선택하는 코드를 작성합니다.
여기서는 Service Bus 큐를 사용하여 메시지를 보내고 받기 위한 코드 작성 프로세스 및 고려 사항을 살펴보겠습니다.
Azure.Messaging.ServiceBus NuGet 패키지
Microsoft에서는 Service Bus를 통해 메시지를 전송하고 수신하는 코드를 쉽게 작성할 수 있도록 .NET 클래스 라이브러리를 제공합니다. 이 라이브러리는 모든 .NET 언어에서 Service Bus 큐 또는 토픽을 조작하는 데 사용할 수 있습니다. Azure.Messaging.ServiceBus NuGet 패키지를 추가하여 애플리케이션에 이 라이브러리를 포함할 수 있습니다.
연결 문자열 및 키
Service Bus 네임스페이스에서 큐에 연결하려면 원본 구성 요소와 대상 구성 요소 둘 다에 두 가지 정보가 필요합니다.
- Service Bus 네임스페이스 위치(엔드포인트라고도 함): 이 위치는 servicebus.windows.net 도메인 내에서 정규화된 도메인 이름으로 지정됩니다. 예를 들면 bicycleService.servicebus.windows.net과 같습니다.
- 액세스 키: Service Bus는 유효한 액세스 키를 요구하여 큐 및 토픽에 대한 액세스를 제한합니다.
이 두 정보는 모두 연결 문자열 형식으로 ServiceBusClient 개체에 제공됩니다. 네임스페이스에 대한 올바른 연결 문자열은 Azure Portal에서 가져올 수 있습니다.
비동기식 메서드 호출
Azure의 큐는 전송 및 수신 구성 요소에서 매우 멀리 떨어져 있을 수도 있습니다. 그리고 실제 위치가 가깝더라도 느린 연결 및 대역폭 경합으로 인해 구성 요소가 큐에서 메서드를 호출하는 경우 지연이 발생할 수 있습니다. 이러한 이유로 인해 Service Bus 클라이언트 라이브러리는 큐와 상호 작용할 수 있도록 async
메서드를 제공합니다. 호출이 완료되기를 기다리는 동안 스레드가 차단되지 않도록 이러한 메서드를 사용하겠습니다.
예를 들어 큐에 메시지를 보낼 때는 await
키워드가 포함된 SendMessageAsync 메서드를 사용합니다.
큐에 메시지 보내기
큐에 메시지를 보내려면 다음 단계를 완료합니다.
모든 전송 또는 수신 구성 요소에서 Service Bus 큐를 호출하는 모든 코드 파일에 다음의 using
문을 추가합니다.
using System.Threading;
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus;
그런 다음, 새 ServiceBusClient
개체를 만들고 이 개체에 연결 문자열과 큐 이름을 전달합니다.
// Create a ServiceBusClient object using the connection string to the namespace.
await using var client = new ServiceBusClient(connectionString);
// Create a ServiceBusSender object by invoking the CreateSender method on the ServiceBusClient object, and specifying the queue name.
ServiceBusSender sender = client.CreateSender(queueName);
ServiceBusSender.SendMessageAsync()
메서드를 호출하고 ServiceBusMessage
를 전달하면 큐에 메시지를 전송할 수 있습니다.
// Create a new message to send to the queue.
string messageContent = "Order new crankshaft for eBike.";
var message = new ServiceBusMessage(messageContent);
// Send the message to the queue.
await sender.SendMessageAsync(message);
큐에서 메시지 받기
메시지를 받으려면 먼저 메시지 처리기를 등록해야 합니다. 메시지 처리기는 큐에서 메시지를 사용할 수 있을 때 호출되는 코드 내 메서드입니다.
// Create a ServiceBusProcessor for the queue.
await using ServiceBusProcessor processor = client.CreateProcessor(queueName, options);
// Specify handler methods for messages and errors.
processor.ProcessMessageAsync += MessageHandler;
processor.ProcessErrorAsync += ErrorHandler;
처리 작업을 수행합니다. 그런 다음, 메시지 처리기 내에서 ProcessMessageEventArgs.CompleteMessageAsync()
메서드를 호출하여 큐에서 메시지를 제거합니다.
await args.CompleteMessageAsync(args.Message);