2012-05-14 4 views
1

현재 Camel을 오케스트레이션 엔진으로 사용하고 있습니다 (HTTP 요청이 들어오고 Camel 응용 프로그램은 특정 HTTP 메시지를 보내고 응답을 기반으로 의사 결정을 내립니다). Camel 애플리케이션은 Apache의 TomCat에서 실행됩니다.Apache Camel : 누가 HTTP 메시지를 보냈습니까?

테스트의 일환으로 점점 더 많은 동시 요청을 내 Camel 애플리케이션에 보내기 시작합니다. 다음과 같이 아래로 벗겨진 cenario은 다음과 같습니다

HTTP POST --> Camel --> HTTP GET to server Z 
        <-- 200 ok (this could take up to 5 sec) 
      <-- 200 ok 

문제 : 20 개 동시 요청을 보낼 때, 모든 (모든 요청은 낙타 응용 프로그램에서 잘 처리됩니다) 잘 간다.

그러나 21 개의 요청을 보낼 때 첫 번째 20 개의 요청이 처리되고 첫 번째 요청이 최종 응답 (= 200 ok)을받은 경우에만 21 번째 HTTP GET 요청이 서버로 전송됩니다 Z ??

이것은 20 개의 요청에 대해 모두 5 초 이내에 처리된다는 것을 의미합니다. 그러나 21 개의 요청을 보낼 때 10 초가 걸립니다 (마지막 요청은 5 초 후에 서버 Z에서만 처리 할 수 ​​있습니다)!

이제 Camel 코드 (서버 Z에 HTTP GET 메시지를 보내기 전후의 타임 스탬프)에 일부 로깅을 추가했습니다. 로그 정보에 따르면 Camel은 21 번째 요청을 보냅니다 즉시! (그것은 첫 번째 메시지의 200 ok 최종 응답을 기다리지 않습니까?)

그래서, 궁금한데 ...이 21 번째 요청 (서버 G에 HTTP GET)은 5 초 동안 멈추었습니까 ?? 그리고 왜 ?? 이건 정말 21 요청에 대한 요약 내 머리 ... 그래서

를 파괴된다

낙타 로그 :

time x   = POST comes in 
    time x+some msec = Camel sends HTTP GET to server Z 
    time x+10  = Camel receives 200 ok on HTTP GET 

와이어 샤크에서 :

time x   = POST comes in 
    time x+5   = Camel sends HTTP GET to server Z 
    time x+10  = Camel receives 200 ok on HTTP GET 

참고 : I 내 낙타 코드에 다음과 같이 타임 스탬프를 인쇄합니다.

.log("${date:now:yyyyMMdd-HH-mm-ss-SSS} **** Sending HTTP GET message... ****") 
    .to("{{serverZ.endpoint}}") 
+0

서버 Z 로그를 살펴 보았습니까? 어떻게 든 서버의 잠재적 지연일까요? –

+0

하이 페터, 답장을 보내 주셔서 감사합니다. 서버를 확인할 필요가 없음 Z : Camel 코드가 실행중인 컴퓨터에서 wireshark 추적을 확인했습니다. 21 번째 요청에 대한 HTTP GET은 20 번째 요청에 대한 200 OK가 수신 될 때까지 서버 Z로 전송되지 않습니다 ... – opstalj

+0

Camel 구성을 게시 하시겠습니까? – altanis

답변

3

추가 조사가 끝나면 제한 요인을 발견했습니다. Apache의 HTTP 공통 클라이언트에는 "MAX TOTAL CONNECTIONS"라는 매개 변수가 있으며 기본값은 ... 20!입니다.

이 매개 변수를 늘리면 더 이상 문제가 발생하지 않습니다.

참고 : Spring 프레임 워크 (STS)와 Eclipse IDE를 사용하고 있습니다. Camel 응용 프로그램의 경우 applicationContext.xml 파일을 다음과 같이 수정했습니다.

<bean id="http" class="org.apache.camel.component.http.HttpComponent"> 
    <property name="camelContext" ref="camel"/> 
    <property name="httpConnectionManager" ref="myHttpConnectionManager"/> 
</bean> 

<bean id="myHttpConnectionManager" class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager"> 
    <property name="params" ref="myHttpConnectionManagerParams"/> 
</bean> 

<bean id="myHttpConnectionManagerParams" class="org.apache.commons.httpclient.params.HttpConnectionManagerParams"> 
    <property name="defaultMaxConnectionsPerHost" value="1000"/> 
    <property name="maxTotalConnections" value="1000"/>  
</bean>