2016-08-22 5 views
1

일반적으로 SQL 연결에 대한 모범 사례는 연결을 열고 쿼리를 실행 한 다음 연결을 처분하는 것입니다. 그러나 RabbitMQ와 같은 AMQP 기반 큐 서버에 권장되는 방법은 무엇입니까? 애플리케이션이 RabbitMQ 서버에 대한 지속적인 연결을 유지하거나 게시자 측에서 전송되는 각 메시지에 대한 연결을 열고 닫아야하는지 여부rabbitmq 연결 모범 사례 게시자의 영구 연결 유지

public static void Main(string[] args) 
    { 
     var factory = new ConnectionFactory() { HostName = "localhost" }; 
     using(var connection = factory.CreateConnection()) 
     using(var channel = connection.CreateModel()) 
     { 
      channel.ExchangeDeclare(exchange: "logs", type: "fanout"); 

      var message = GetMessage(args); 
      var body = Encoding.UTF8.GetBytes(message); 
      channel.BasicPublish(exchange: "logs", 
           routingKey: "", 
           basicProperties: null, 
           body: body); 
      Console.WriteLine(" [x] Sent {0}", message); 
     } 

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

    private static string GetMessage(string[] args) 
    { 
     return ((args.Length > 0) 
       ? string.Join(" ", args) 
       : "info: Hello World!"); 
    } 

답변

6

는 RMQ에, 연결은 "비용"으로 간주된다 -이 SQL 서버 땅에서 사소한 보일 수도 있지만 당신이 전송에 대해 이야기 할 때 그들이하는 TCP/IP 포트를 차지 등 핸드 쉐이크/협상을 필요로 RabbitMQ에서 초 당 100K + 메시지가 발생하면 그 오버 헤드가 발생하지 않습니다.

RMQ를 사용하면 일반적으로 응용 프로그램 인스턴스 당 하나의 연결을 열어 가능한 한 오랫동안 열어 두는 것이 가장 좋습니다.

앱 인스턴스 내에서 RMQ 연결 위에 채널을 생성합니다. 그리고 이것들을 매우 빠르게 만들 수 있습니다. 대부분의 앱은 RMQ에서 한 가지 용도로 단일 채널을 사용합니다. 메시지 생성자? 채널을 엽니 다. 대기열에서 소비 중입니까? 채널을 엽니 다. 대기열을 재정의 하시겠습니까? 채널 등을 엽니 다.

또한 C#과 같은 스레드가있는 언어로 작업하는 경우 채널을 단일 스레드로 제한해야합니다. 스레드간에 채널을 다시 사용하지 마십시오. 그렇게하려고하면 아주 나쁜 일이 일어날 것입니다.

+0

저는 엘릭서와 함께 RMQ를 사용하고 있습니다. 내가 게시하는 각 메시지에 대해 새 채널을 만들거나 모든 게시 비즈니스에 대해 하나의 채널을 만들어야합니까? – fay