RabbitMQ로 메시지 보내기

완료됨

큐를 만들고, 메시지를 보내고, RabbitMQ에서 메시지를 받는 코드를 작성하는 것은 간단합니다. .NET Aspire 솔루션에서는 RabbitMQ 컨테이너를 만들고 마이크로 서비스에서 이에 연결하는 데 도움이 됩니다.

사용자의 아웃도어 장비 판매점에서는 고객이 대면하는 제품 카탈로그 웹 사이트를 위한 중앙 집중식 메시지 브로커로 RabbitMQ를 구현하기로 결정했습니다. .NET Aspire RabbitMQ 통합을 사용하여 이 브로커와 해당 큐를 관리하려고 합니다.

이 단원에서는 RabbitMQ 컨테이너를 만들고 이를 사용하여 메시지를 보내고 받는 방법을 알아봅니다.

.NET Aspire RabbitMQ 통합 사용

.NET에서 RabbitMQ를 사용하는 경우 일반적으로 연결 문자열이 포함된 ConnectionFactory 개체를 만든 다음 이를 사용하여 서비스에 연결해야 합니다. .NET Aspire 프로젝트에서는 다음과 같은 이유로 RabbitMQ 연결을 관리하는 것이 더 쉽습니다.

  • AppHost 프로젝트에 연결 및 연결 문자열을 등록합니다.
  • 서비스에 대한 참조를 소비 프로젝트에 전달하면 종속성 주입을 사용하여 RabbitMQ에 연결할 수 있습니다. 자체 연결을 만들고 구성할 필요가 없습니다.

앱 호스트에서 RabbitMQ 구성

.NET Aspire에서는 앱 호스트에 Rabbit MQ 호스팅 통합을 설치해야 합니다.

dotnet add package Aspire.Hosting.RabbitMQ

이제 RabbitMQ 서비스를 등록하고 이를 사용하는 프로젝트에 전달할 수 있습니다.

// Service registration
var rabbit = builder.AddRabbitMQ("messaging");

// Service consumption
builder.AddProject<Projects.CatalogAPI>()
       .WithReference(rabbit);

AppHost는 솔루션의 모든 프로젝트에 대한 연결을 관리합니다.

Rab 구성

다음으로, 이를 사용하는 각 프로젝트에 .NET Aspire RabbitMQ 통합을 추가합니다.

dotnet add package Aspire.RabbitMQ.Client

RabbitMQ 메시지 브로커에 대한 참조를 가져오려면 AddRabbitMQClient() 메서드를 호출합니다.

builder.AddRabbitMQClient("messaging");

이제 종속성 주입을 사용하여 RabbitMQ에 대한 연결을 가져올 수 있습니다.

public class CatalogAPI(IConnection rabbitConnection)
{
    // Send and receive messages here
}

연결 후 다음 단계는 다음과 같은 메시징 채널을 만드는 것입니다.

var channel = connection.CreateModel();

메시지 보내기

메시징 채널이 있으면 이를 사용하여 메시징 토폴로지의 큐, 교환 및 기타 통합을 설정할 수 있습니다. 예를 들어, 큐를 만들려면 다음 코드를 사용합니다.

channel.QueueDeclare(queue: "catalogEvents",
    durable: false,
    exclusive: false,
    autoDelete: false,
    arguments: null);

BasicPublish 메서드를 사용하여 이 큐에 메시지를 보내지만 메시지는 본문이 바이트 배열일 것으로 예상합니다.

var body = Encoding.UTF8.GetBytes("Getting all items in the catalog.");

channel.BasicPublish(exchange: string.Empty,
    routingKey: "catalogEvents",
    basicProperties: null,
    body: body);

메시지 수신

수신 통합에서는 보낸 사람과 동일한 방식으로 메시징 채널과 큐를 만듭니다. 큐 이름이 전송 통합에서는 만든 이름과 일치하는지 확인합니다. 일치하지 않으면 두 개의 별도 큐가 만들어지고 메시지가 올바른 대상에 도착하지 않게 됩니다.

EventingBasicConsumer() 메서드를 만들고 Received 이벤트를 처리할 메서드를 등록해야 합니다.

var consumer = new EventingBasicConsumer(channel);
consumer.Received += ProcessMessageAsync;

메시지 처리기는 BasicDeliverEventArgs 개체를 사용하여 메시지 본문을 포함한 메시지 속성을 가져옵니다. 메시지 본문을 역직렬화해야 합니다.

private void ProcessMessageAsync(object? sender, BasicDeliverEventArgs args)
{
    string messagetext = Encoding.UTF8.GetString(args.Body.ToArray());
    logger.LogInformation("The message is: {text}", messagetext);
}

마지막으로 새 메시지의 큐를 확인하려면 BasicConsume() 메서드를 호출합니다.

channel.BasicConsume(queue:  queueName,
                    autoAck: true, 
                    consumer: consumer);

자세한 정보