2016-09-13 5 views
0

새 작업을 처리 할 수있는 경우 60 초마다 60 초마다 실행되는 작업 에이전트가 있습니다. 처리하는 동안 에이전트는 로깅 목적으로 정적 TraceHelper 클래스를 사용합니다. 로그 파일에 쓰는 시점에서 WebRequest를 외부 API로 보내 로그 항목을 Logstash에 전달합니다.동일한 HttpRequestMethod를 호출하면 기존 작업이 완료 될 때까지 대기

Webrequest는 기본적으로 각 Writeline에 대한 json 개체를 보냅니다. 분명히 로깅 목적으로, 순서가 중요하므로 내 질문은, 비록 내가 단지 하나의 POST HttpWebRequest를 호출한다고해도 이것이 수 백 번 발생한다는 것입니다. 문제를 동기화하는 것에 대해 걱정해야합니까? 첫 번째 Writeline에 보낼 기회가 있기 전에 두 번째 Writeline 요청이 HttpWebRequest에 의해 호출되고 처리 될 가능성이 있습니까? 아니면 내가 잘못보고 있니?

참고 : 아래 반 의사 코드

은 내가

Tracehelper.Writeline("foo") 
Tracehelper.Writeline("baa"); 


static Tracehelper(){} 


public static void Writeline(string msg) 
{ 
    File.WriteToFile(msg); 
    WebProcessHelper.SendLog(msg); 
} 



static WebProcessHelper() {} 

public static void SendLog(string msg) 
{ 
    SendHttpRequest(msg); 
} 

아래는 "매"가 앞서 "foo는"에 전송하는 가능성이있는이 있다고?

답변

-1

특히 한 번에 여러 스레드를 처리하는 경우에는 가능성이 있다고 가정하는 것이 안전합니다. 안전한 옵션은 BlockingCollection 또는 문자열을 BlockingCollection에서 끌어와 logstash로 보내는 별도의 스레드를 설정하는 것입니다.

그런 식으로 누군가가 BlockingCollection에 무엇인가 쓸 수 있고, 모든 것이 올바른 순서로 원격 서버로 전송되도록 할 수 있습니다.

+0

스레딩에 대한 언급이 없었으며, 동일하지 않은 비동기 만있었습니다. 로깅은 항상 일괄 처리되어야하며 특히 원격으로 로깅하는 경우에는 특히 중요합니다. – Tim

0

실제로 웹 요청에 사용하는 클래스를 모르지만 기본적으로 비동기 클래스라고 가정하고이를 기반으로 답할 것입니다. 다른 것을 사용하는 경우 대답이 다를 수 있습니다.

예 아니요. 요청은 모두 클라이언트에 의해 해고됩니다. 그러나이 작업을 초당 수백 번 수행하는 경우 서버의 처리 용량을 초과하여 겹쳐서 초과 할 수 있기 때문에 동일한 순서가 아닌 다른 끝의 서버가 수락 한 메시지를 가질 수 있습니다. 연결 수와 사용 된 서버 소프트웨어에 따라 달라집니다.

이렇게 말하면 수백 초 동안 HTTP 호출을하는 것이 끔찍한 생각입니다. 로깅이 필요하면 로깅 프레임 워크를 사용하십시오. 로깅 프레임 워크를 사용하면 매 초 또는 두 초마다 로깅을 버퍼링하고 일괄 처리 할 수 ​​있습니다. 이렇게하면 대역폭을 크게 절약하고 확장 성을 추가하며 로그인하는 서버의 CPU로드를 줄일 수 있습니다.

nLog 또는 MS의 시맨틱 응용 프로그램 로깅 블록을 적극적으로 권장 할 수 있습니다. 둘 다 사용 했었고 두 가지 모두 정말 유연하고 하중을 잘 처리합니다.

+0

답장을 보내 주셔서 감사합니다. 나는 전체 프로젝트를 시작하기위한 여지가 많지 않거나 욕망이 없다고 생각합니다. 결국 WebRequest를 보내는 메서드는 보내기 전에 일괄 처리를 수행합니다. 1 사이클 당 약 100 배치. 나는 내가 그것을 배치했다해도 내가하고 싶었던 점을 짐작한다. 나는 요청이 그들을 보낼 수있는 순서에 대해 알고 싶었다. 나는 대답을 지금 가지고있다. 이제 .NET 4.5에서 비동기식 webreqeust 프레임 워크를 살펴 보겠습니다. – Dritzz

관련 문제