끄적이는 메모장

[.NET Core 2.x] RabbitMQ 연동 본문

C, C++, C#/C# ASP.NET

[.NET Core 2.x] RabbitMQ 연동

밥보92 2018. 4. 6. 10:59
반응형

순차적으로 처리가 보장되어야 하는 로직이 존재한다면 MQ를 이용하는 것이 좋다

RabbitMQ는 대표적인 MQ 중 하나로서 .NET Core에서 어떻게 연동 되는지를 다루려고 한다.

 

1. RabbitMQ client 설치하기

> VS Code 터미널로 rabbitmq client를 설치 해 주자.

  dotnet add package RabbitMQ.Client --version 5.0.1

 

2. RabbitMQ server 설치하기

> RabbitMQ server를 통해서 메시지를 교환하게 된다.
(다운로드 : https://www.rabbitmq.com/download.html)

> RabbitMQ란

- 서비스 간에 메시지를 전달해주는 시스템

- producers : 메시지를 발송자

- consumers : 매시지 수신자

- producers는 Queue를 통해 consumer에게 메시지를 보내게 된다.

- Queue의 특성상 producer가 보낸 메시지들이 consumer에게 순차적으로 전달이 되기 때문에 순서를 보장해야 하는 서비스에 사용이 된다.

- Queue에 여러 설정을 통해 동기 방식으로 메시지를 처리할 수도 있다.

> RabbitMQ Server 3306 port를 통해 서비스 된다.

 

3. tutorials

(http://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html)

a. send 부분

using RabbitMQ.Client;
using RabbitMQ.Client.Events;

 {
    public static void Main()
    {
        var factory = new ConnectionFactory() { HostName = "localhost" };
        using (var connection = factory.CreateConnection())
        {
            using (var channel = connection.CreateModel())
            {
                channel.QueueDeclare(queue: "hello",
                                     durable: false,
                                     exclusive: false,
                                     autoDelete: false,
                                     arguments: null);
                ...
            }
        }
    }
}

> ConnectionFactory를 통해 RabbitMQ server와의 연결 관리를 해준다.

> connection을 맺으면 connectionFactory에서 관리가 된다.

> 다시 connection에서 exchange와 queue를 관리 하기 위한 Channel을 만들고 channel을 통해 메시지를 송수신 한다.

> 해당 예제는 Hello라는 이름을 가진 Queue를 생성하였고 이를 통해 메시지를 publish할 수 있다.

 

b. receive 부분

 using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;

class Receive
{
    public static void Main()
    {
        var factory = new ConnectionFactory() { HostName = "localhost" };
        using(var connection = factory.CreateConnection())
        using(var channel = connection.CreateModel())
        {
            channel.QueueDeclare(queue: "hello",
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null);

            var consumer = new EventingBasicConsumer(channel);
            consumer.Received += (model, ea) =>
            {
                var body = ea.Body;
                var message = Encoding.UTF8.GetString(body);
                Console.WriteLine(" [x] Received {0}", message);
            };
            channel.BasicConsume(queue: "hello",
                                 autoAck: true,
                                 consumer: consumer);

            Console.WriteLine(" Press [enter] to exit.");
            Console.ReadLine();
        }
    }
}

> receive 부분에서는 send 부분가 동일한 이름을 가진 Queue를 선언 해야만 send 부분에서 보내는 메시지를 받을 수 있게 된다.

> BasicConsumer 에서 어떤 이름을 가진 Queue에 대해서 메시지를 받을 것인지 지정할 수 있다.

 

위의 예제는 Queue를 통해서 메시지를 주고 받는 예제이다.

더 나아가 exchange를 이용한다면 메시지의 broadcast도 가능하도록 서비스를 구성할 수 있다.

rabbitMQ에서 예제를 친절하게 제공하고 있으므로 참고해서 활용할 수 있을 것이다.

반응형

'C, C++, C# > C# ASP.NET' 카테고리의 다른 글

[.NET Core 2.x] Swagger 연동  (0) 2018.04.06
[.NET Core 2.x] NoSQL (Couchbase) 연동  (0) 2018.04.05
[.NET Core 2.x] REST API + MySQL  (0) 2018.04.05
[.NET Core 2.x] VS Code + MySQL  (0) 2018.04.04
[.NET Core 2.x] Visual Studio Code  (0) 2018.04.04