2011-05-16 3 views
3

나는 내 손에 흥미로운 상황이 있습니다. 몇 년 동안 우리는 로깅을 위해 우리 네트워크에서 사용하는 IIS 상자에서 실행되는 WCF 서비스를 사용했습니다. 응용 프로그램은 basicHttpBinding을 사용하여 로그 메시지를 보내고 데이터베이스에 기록합니다. 다른 모든 응용 프로그램의 대부분의 로깅은 작업 당 수십 개의 로그로 제한됩니다. 최근에 우리는이 로깅 서비스를 사용하기 위해 다른 애플리케이션을 포팅했습니다. 이 응용 프로그램은 로깅 서비스를 위해 다른 클라이언트보다 훨씬 공격적으로 기록됩니다. 그것은 그 과정에서 100,000 이상의 메시지를 로깅 할 수있는 작업을 가지고 있습니다 (이것은 CSV 파일을 통해 100,000 개의 레코드를 가져 오는 것입니다).MSMQ에서 WCF 웹 서비스를 통한 로그 버퍼링

이 작업을보다 효율적으로 수행 할 수있는 방법을 찾기 위해 MSMQ를 사용하여 로그 요청을 대기열에 넣고 응용 프로그램이 로깅 서비스와 직접 통신하는 대신 서비스에 전달하도록 제안했습니다 (요청 성능 목적으로 별도의 스레드에서이 전송되었습니다. 이 방법으로 로그 작성 중에 응용 프로그램이 차단되지 않습니다. 로컬 컴퓨터에서이 MSMQ 솔루션에 대한 개념 증명을 구현했지만 전에는 MSMQ를 사용 해본 적이 없으며 기술적으로 무엇인지 알기 때문에 많은 질문과 답변으로 나 자신을 찾고 있습니다. . MSMQ가 어떻게 작동하는지에 대한 간결한 정보를 누군가에게 알려 주어 내가 작성한 개념 증명을 더 잘 디버깅 할 수 있기를 희망한다. 내가 MSMQ를 구현 한 후보고 있어요 무엇

: MSMQ에 로그를 전송

  • 내 응용 프로그램은 거의 즉시 내가 원하는이다 (오히려 최선을 다하고있을 에 로그를 기다리는 것보다) 반환합니다.
  • 내가 미만 30 초 MSMQ 응용 프로그램에 1000 로그를 전송하더라도, 모든 1000 로그가 데이터베이스를 만들 수 몇 분 정도 걸립니다. 마치 대기열에 로그 요청을 보유하고있는 곳에서 스로틀을 사용할 수있는 것처럼 보이지만 어떻게 확인해야할지 모르겠다.
  • MSMQ 서비스에서 로그를받는 서버에서 net.tcp를 사용하면 서비스 시간 초과 오류가 발생하고 로그의 90 % (또는 그 이상) 만 데이터베이스에 저장됩니다.하지만 basicHttpBinding을 사용하면 작동합니다 안정적으로 내가 전화를 사용하는 응용 프로그램의 코드 여기
    public void QueueLog(Log log) 
    { 
        try 
        { 
         ServiceClient writeLog = getLoggingService(); 
    
         string exceptionText = log.Exception == null ? string.Empty : log.Exception.ToString(); 
         writeLog.WriteCompatibleLog(log.LoggerName, (LoggingService.Logging.LogType)log.LogType, exceptionText, log.Message, log.ApplicationName, Utility.GetAssemblyVersion(Assembly.GetCallingAssembly()), 
          Utility.GetFirstIPAddress(), Utility.GetHostName(), log.Category); 
        } 
        catch (Exception ex) 
        { 
         Debug.WriteLine("LoggingServiceWrapper.DotNet Error\n\n" + ex.GetBaseException().Message + "\n\n" + ex.GetBaseException().StackTrace); 
        } 
    } 
    
    private ServiceClient getLoggingService() 
    { 
        return new ServiceClient(new BasicHttpBinding(), new EndpointAddress("http://MyServer/Service.svc")); 
    
    } 
    

    는 MSMQ 서비스 여기

    if (!MessageQueue.Exists(Properties.Settings.Default.QueueName)) 
    { 
        MessageQueue.Create(Properties.Settings.Default.QueueName, true); 
    } 
    
    ServiceHost serviceHost = new ServiceHost(typeof(LoggingServiceQueue.LoggingServiceQueue), new Uri(Properties.Settings.Default.Address)); 
    { 
        serviceHost.Open(); 
    
        Console.ReadLine(); 
    
        serviceHost.Close(); 
    } 
    

    을 만들어 내 코드입니다 : 여기

내 MSMQ 서비스의 코드 MSMQ 서비스 :

LoggingServiceQueueClient client = new LoggingServiceQueueClient(new NetMsmqBinding(NetMsmqSecurityMode.None), new EndpointAddress("net.msmq://localhost/private/Logging")); 

client.QueueLog(new LoggingServiceQueue.Log 
{ 
    LoggerName = loggerName, 
    LogType = (LoggingServiceQueue.LogType)logType, 
    ApplicationName = applicationName, 
    Category = category, 
    Exception = exception, 
    Message = message, 
    SourceHostName = Utility.GetHostName(), 
    SourceIp = Utility.GetFirstIPAddress(), 
    Version = Utility.GetAssemblyVersion(callingAssembly) 
}); 

감사합니다. meone이 제공 할 수 있습니다. MSMQ를 사용하여 어떤 기능을 사용할 수 있는지 정확히 알지 못합니다. Google을 통해 6 시간이나 계속 연구했습니다. 내가 찾은 대부분의 문서는 꽤 오래되었습니다 (2007 년). 아마 그들은 내가 주제에 대한 약간의 기초 지식을 가지기를 기대하고있다.

답변

1

WCF에서 net.msmq 바인딩을 사용하는 경우 표시되는 내용입니다.

저장 및 전달 기능인 MSMQ는 네트워크 또는 처리 대역폭을 사용할 수있을 때까지 송신 클라이언트와 수신 서버의 큐에 메시지를 저장합니다. 이것이하는 일은 프로세스를 비동기로 만들어 클라이언트에서 부하를 제거하는 것입니다.

성능 모니터를 사용하여 큐의 상태를 볼 수 있으며 아웃 바운드 큐 (클라이언트에서) 및 서버 큐가 실시간으로 성능 카운터에 기록되고 볼 수 및/또는 기록 할 수 있습니다.

성능이 차선책 인 경우 WCF 제한 설정을 변경하여 서비스 동작에 더 많은 동시 연결을 허용 할 수 있습니다.

<serviceThrottling 
     maxConcurrentCalls="20" 
     maxConcurrentSessions="20" 
     maxConcurrentInstances="20" 
     /> 

+0

당신은 성능 오버 헤드가 로컬 MSMQ 서비스와 통신처럼 있어야하는데 무엇을 알고 있는가? 처리 부하를 줄이기가 주 목적이므로 비교적 빨리 처리 할 수 ​​있다고 생각합니다. 위에 올려 놓은 서비스가 웹 서비스 또는 MSMQ 서비스에 대한 제안입니까? – omatase

+0

클라이언트의 경우 응답 대기 시간이 없기 때문에 오버 헤드는 10 밀리 초 정도이어야합니다. Throttling 매개 변수는 MSMQ를 통해 노출되는 경우 WCF 서비스 끝점에 적용해야합니다. – DaveRead

+0

뭔가 잘못되었습니다. 100,000 개의 로그 요청이 1 시간 이내에 성공적으로 대기되었지만 MSMQ 앱은 10 시간 후에도 WCF 서비스에 로그를 보내고 있습니다! 로그가 MSMQ 응용 프로그램에 신속하게 전달되므로 문제가되지 않습니다. 어떤 이유로 MSMQ 응용 프로그램은 가능한 빨리 로그를 푸시하지 않으려합니다. 병목 현상이 다른 서버의 WCF 로깅 서비스가 아니라는 것을 알고 있습니다. 100,000 개의 로그 항목이 MSMQ없이 이동하는 것보다 훨씬 빠르게 발생합니다. – omatase

관련 문제