2015-02-02 3 views
1

Erlang으로 작성된 웹 서비스가 있습니다. 일부 요청으로 인해이 서비스는 Erlang에서 다른 웹 서비스를 호출합니다. 두 번째 서비스는 매우 느리고 일부 요청 실행 시간은 1 분에 도달합니다. 이 서비스에 대한 요청 횟수는 매우 제한적이므로이 서비스에 대한 모든 요청에 ​​대해 시간 제한을 사용합니다. 저는 다른 http 클라이언트를 사용했습니다 : gun, httpc, hackney 및 기타. 시작 시스템이 예상대로 작동하면 몇 분 후에 제한된 요청 수가 전송되지만 전혀 요청이 전송되지 않습니다. 모든 http 클라이언트는 동일한 결과를 제공합니다. 여기에 설명 된 유사한 문제 : http://comments.gmane.org/gmane.comp.lang.erlang.general/73146 제발, 조언을 해주세요, 문제를 일으킬 수있는 것은 무엇입니까? 나는 ulimit와 다른 환경 옵션을 검사했다, 모든 것은 괜찮다.높은 부하에서 Erlang http 클라이언트가 작동하지 않습니다.

+0

백엔드 (2 차 서비스)는 어떤 종류의 연산을 수행합니까? 저속 IO는 네트워크 속도에서부터 병목 현상에 이르기까지 많은 것들을 냄새로 느낄 수 있습니다. 요청을 단순화하려고 시도 했습니까? –

+0

두 번째 서비스는 Oracle DB 용 인터페이스이며 일부 쿼리를 수행합니다. 왜냐하면 DB에 대한 연결의 양이 제한되어 있기 때문에 많은 요청이 대기열에있어 자유로운 연결을 기다리고 있습니다. 첫 번째 서비스 (두 번째 서비스에서 새 연결 없음)에서 http 요청이 중단되면 두 번째 서비스는 무료이며 DB에 대한 모든 연결을 사용할 수 있습니다. 처음 서비스를 다시 시작하면 모든 것이 일정 시간 동안 반복되고 상황이 반복됩니다. 내가 아는 한 - 첫 번째 서비스에서 많은 HTTP 연결을 대기하는 문제가 있습니다. –

답변

0

모든 http 클라이언트에서 동일한 동작이 발생한다고 가정하므로 코드가 일반적인 변수라고 생각합니다.

디버깅을 시작하는 것이 HTTP 호출을 조롱하는 것이 좋습니다. 이 작동하는 경우 대신

{ok, Result} = httpc:request("http://my.oracle/dostuff") 

사용

do_request(_Url) -> 
    {ok, {200, <<"fake results">>}}. 

.... 
% inside some other method 
    {ok, Result} = do_request("http://my.oracle/dostuff") 

의 오랜 시간 (서버의 느린 응답을 시뮬레이션)을 위해 잠을 당신의 do_request을 수정하려고합니다.

관련 문제