2011-11-18 5 views
3

RabbitMQ를 사용하면 MSSMQ와 비슷한 방법으로 큐에서 1000 개의 메시지를 팝핑 한 다음 데이터베이스에 삽입하고 거기에서 계속할 수 있습니다.RabbitMQ and C#

구독을 채널로 구독 한 다음 Subscription에서 BasicDeliveryEventArgs를 통해 foreach를 수행하는 것처럼 보이지 않습니다. 지정된 시간에 처리하려는 최대 메시지 수를 사용하여 If 문을 수행합니다. 이것은 그러나 여전히

using (IConnection connection = factory.CreateConnection()) 
{ 
    using (IModel channel = connection.CreateModel()) 
    { 
     channel.QueueDeclare("****", true, false, false, null); 

     var subscription = new Subscription(channel, "****", false); 
     int maxMessages = 5; 
     int i = 0; 
     foreach (BasicDeliverEventArgs eventArgs in subscription) 
     { 
      if (++i == maxMessages) 
      { 
       Console.WriteLine("Took 5 messages"); 
       subscription.Ack(eventArgs); 
       break; 
      } 
     } 
    } 
} 
+1

나는 특히 "if if doing if if"부분을 이해하지 못한다. 명확히 해 주시겠습니까? –

+0

게시물을 업데이트했습니다. – user1053237

+0

아직도 나에게 이해가 가지 않습니다. 무엇을 성취하려고합니까? –

답변

9

난 당신이 오히려 더 큰 거래로의 그룹을 일괄 처리하여 데이터베이스에 메시지로드를 최적화 할 있으리라 믿고있어 큐에서 모든 22K 메시지를 취 사전 에

감사합니다 메시지 하나당 거래 비용보다 큽니다.

: 채널에 그렇게하는 그 중 하나가 여기에 문제가 발생하면 그것에 대해 가고 싶어 방법은 경우에도 함께 실패 할 수있는 메시지의 큰 그룹을 의미하는 의무 경고 ...

설정 QOS로

channel.BasicQos(0, 1000, false); 

이것은 무언가를 ACK 할 때까지 1000 개의 메시지를 미리 가져오고 추가 트래픽을 차단합니다. 1000 블록 단위로 가져 오지는 않습니다. 오히려 한 번에 최대 1000 개의 UNACK'ed 메시지가 사전 페치되도록합니다. 블록 전송을 시뮬레이션하는 것은 1000 개의 메시지를 먼저 처리 한 다음 한 번에 모두 ACK'ing하는 것만 큼 간단합니다.

광산보다 권위있는 설명을 위해 herehere을 참조하십시오.

한 가지 추가 사항 : 메시지를 사용할 수있게되는 즉시 메시지 큐를 플러시 할 수 있습니다. 사용자가 1000 개의 메시지 할당량을 지정하지 않은 경우에도 마찬가지입니다. 건조한 상태가 될 때까지 queue.BasicGet()foreach 루프 내에서 호출 한 다음 데이터베이스에 가지고있는 메시지 (subscription에서 빼낸 메시지 포함)를 전달하면됩니다. 경고 : 나는 이것을 직접 시도하지 않았으므로 쓰레기를 말할 수는 있지만 작동 할 것이라고 생각한다. 이 방법의 장점은 1000 개의 메시지 전체를 기다릴 필요없이 즉시 메시지를 데이터베이스에 저장한다는 것입니다. 너무 많은 작은 트랜잭션을 처리 할 때 데이터베이스가 뒤쳐지면 프리 페치 백 로그가 각주기마다 더 많이 채워집니다.