다양한 네트워크를 한개의 라이브러리에서 관리할 수 있도록 설계 함
메세지 큐 시스템으로 어플리케이션간에 데이터를 비동기적으로 안전하게 전달할 수 있도록 도와줌
Autofac의 ContainerBuilder()를 이용해서 추가한다.
var containerBuilder = new ContainerBuilder();
new RabbitMQModule().RegisterModule(containerBuilder);
new RabbitMQModule().SetConfiguration(containerBuilder);RegisterModule()을 호출하면 내부적으론 RabbitMQ 구동에 필요한 모든 종속성을 등록한다.
RabbitMQ를 사용하기 위해서는 new RabbitMQModule().SetConfiguration()을 이용해 설정 값을 전달해줘야하는데 형식은 반드시 아래와 같은 형식으로 지정되어야 한다. 내부에선 MS의IConfiguration (참고 .NET의 구성)을 사용해서 받은 설정 값을 사용한다.
{
"Network": {
"RabbitMQ" {
"ServerName": "server:1", // 현재 서버의 이름
"VirtualHostName": "/", // 호스트 이름
"ExchangeName": "Nolowa.topic", // 교환기 이름
"Address": "localhost", // 엔드포인트 주소
"Port" = 6672, // 접속 포트
"UserName" = "admin", // 접속 아이디
"Password" = "admin", // 접속 비밀번호
}
}
}-
RabbitNetworkClient
Connect(),Send<T>(),Receive()과 같은 실제로RabbitMQ에 종속된 코드가 있다. -
MessageMaker
RabbitMQ가 메시지를 보낼 때 필요한 데이터 모델을 만들어주는 객체. 기본적으로는 메시지를 보내는 서버, 메시지를 받는 서버 등의RabbitMQ메시지의 필수 적인 요소를 채워주는 역할을 한다. 이러한 메시지는NetMessageBase객체로 추상화 되어있어 모든 통신은NetMessageBase객체를 기반으로 진행된다. -
MessageBroker
실제로 메시지를 보내는 역할을 하는 객체. 내부적으로 비동기 큐인 Channel을 이용해서 비동기적으로 다른 서버의 메시지를 보내고 응답을 기다린 후 리턴할 수 있는 함수와 서버에 메시지를 보내고 처리 결과를 리턴받지 않는 형태의 함수가 있다. 이 모듈의 모든 함수는
NetMessageBase로 추상화 된 메시지를 받도록 되어있다. -
Worker
실제 메시지를 보내거나 받을 때 사용하는
Channel로 된 비동기 대기가 가능한 버퍼로써MessageBroker는 메시지를 직접 보내지 않고Worker에 넣는 역할만 한다.Worker에 넣어진 데이터는Worker의 thread에서 메시지를 다른 서버로 보내거나 본인 서버에서 처리가 필요한 일이면 올바른 Handler로 라우팅 한다.
데이터 전송을 Worker를 통해 전송하고 받는 측에서는 메시지의 타입을 분석해 올바른 Handler로 라우팅 해서 메시지를 처리한다.
데이터를 전송할 때 응답을 받을 Outbox를 만들고 응답 데이터가 들어올 때까지 기다린다. 전송 될 데이터는 응답이 필요하다는 플래그를 달고 전송된다. 데이터가 타겟 서버로 전송 후 처리가 완료되면 전송 됐던 곳으로 응답을 보낸다. 전송을 했던 서버는 응답을 받게 되고 메시지에서 응답으로 전송됐다는 플레그가 확인되면 핸들링하지 않고 Outbox에 데이터를 넣는다. 데이터가 들어가면 대기가 풀리고 받았던 응답을 사용자에게 리턴한다.
추후 Http도 추가 예정

