2015-01-21 2 views
2

나는 Nginx 뒤에 요청을받는 Wookie 기반 앱이 있습니다. 응용 프로그램은 일반적으로 작동하지만 병렬 요청과 관련된 몇 가지 문제가 있습니다. 예를 들어, 앱이 데이터베이스 (mongodb, cl-mongo를 통해)의 데이터 세트에서 보고서를 생성하기 위해 장기 실행 요청 (R1)을 수락하면 그 전에 들어오는 다음 요청 (R2)에 응답하지 않는 것처럼 보입니다. R1에 대한 응답이 네트워크를 통해 전송되기 시작합니다.Wookie Common Lisp 서버가 요청을 병렬로 처리합니까?

클라이언트가 R2에 대해 서버와 통신하는 동안 오류를보고하지만 서버가 R1으로 끝나고 마지막으로 응답을 보낸 후에 R2를 처리하려고 시도합니다 (디버깅 출력에서 ​​분명 함) - 올바른 라우팅 등을 수행합니다 너무 늦게).

요청 처리 루틴 주위에 블랙 버드 약속을 두지 않으면 도움이되지 않습니다. 어쨌든 Wookie는 비동기로 설계되어 있기 때문에 아마도 과도했습니다.

그럼 어떻게 처리 할 수 ​​있습니까? 나는 (매우 긴 타임 아웃을 통해) 오랜 시간 동안 응답을 기다리는 고객들에게는 괜찮은 편이지만 짧은 요청을 병렬로 처리하는 것이 훨씬 더 낫다.

답변

3

cl-async의 기본 라이브러리 (libevent2, libuv)에 대한 아이디어는 다른 작업 (요청)의 CPU 시간에 대해 하나의 작업 (요청)의 IO 대기 시간을 사용하는 것입니다. 따라서 IO 대기 시간을 낭비하지 않는 메커니즘 일뿐입니다. 병렬로 일어나는 유일한 일은 IO와 한 번에 CPU를 사용하는 하나의 작업 (구현에 따라 스레드/프로세스별로)입니다. 귀하의 요청이 CPU 시간의 avarage x MS에 필요한 경우

후 즉시 병렬 n 요청이로, 코어의 수는 어디 n입니다, 당신의 n+1 번째 요청 여부에 관계없이 적어도 x MS를 기다려야합니다 스레드 또는 이벤트 기반 서버를 사용합니다.

물론 서버 프로세스를 추가로 생성하고로드 균형 조정을 사용하여 사용 가능한 모든 코어를 사용할 수 있습니다.

+0

cl-async가 본질적으로 멀티 스레드가 아니라고 말하는가? 이론적으로 병렬 요청의 실행을 스레드로 래핑하여 문제를 해결해야합니까? – minya

+1

예, 본질적으로 멀티 스레드가 아니며 특정 지점까지 예. 우리의 요청 처리 시간이 길어질수록 (CPU 사용 또는 블로킹으로 인해) 시간당 요청 량이 일정하다고 가정 할 때 더 많은 리소스 (코어)를 던져야합니다. 또 다른 질문입니다. 조사 할 가치가 있습니다. 데이터베이스 IO가 차단 되었습니까, 아니면 cl-mongo가 cl-async를 사용합니까? –

+0

내가 수집 할 수있는 것부터 cl-mongo는 cl-async를 사용하지 않지만 다중 스레드로 간주됩니다. – minya