2013-09-07 8 views
0

나는 순간에 다음과 같은 아키텍처가 :디버그 누락 된 메시지 akka

로드 (부하 테스트를위한 기본 인터페이스 재생 응용 프로그램) -> 게이트웨이 (수신 메시지에 대한 REST 인터페이스 스프레이 응용 프로그램) -> 프로세서 (akka MongoDB와 호환되는 앱) -> MongoDB

내가 밀고 나가는 메시지의 수가 낮 으면 모든 것이 잘 작동합니다. 그러나 10000 개의 이벤트를 푸시하려고하면 결국 MongoDB에서 문서로 끝나게됩니다. 예를 들어, 742 메시지 나 982 메시지와 같이 임의의 위치에서 멈추고 아무 것도하지 않습니다.

그런 상황을 디버깅하는 가장 좋은 방법은 무엇입니까? 스프레이 측의 workerRouter

WS.url(server + "/track/message").post(Json.toJson(newUser)).map { response => 
    println(response.body) 
    true 
} 

에 다음

for (i ← 0 until users) workerRouter ! Load(server, i) 

과 : 부하 측면에서 그냥 REST 서비스로 열심히 밀어하고

pathPrefix("track") { 
    path("message") { 
    post { 
     entity(as[TrackObj]) { msg => 
     processors ! msg 
     complete("") 
     } 
    } 
    } 
} 

를 프로세서 측면에서 그것은이다 기본적으로 컬렉션에 삽입됩니다. 어디서부터 시작해야 하는가?

업데이트 : Gatewat에 메시지를 작성하는 논리를 옮기려고했는데 1에서 10000 사이의주기가 있었지만 제대로 작동합니다. 그러나 스프레이와 플레이가 파이프 라인에 포함되어 있으면 인터럽트 나 임의의 위치가 중단됩니다. 이 경우 디버깅하는 방법에 대한 제안 사항은 무엇입니까?

+0

유형 콘솔을 사용해 보셨습니까? –

+0

아니, 아직 시도하지 않았다. 문제가 Play에 있음을 알게되었습니다. <-> 스프레이 통신. 스프레이 쪽에서 100000 레코드 만 수행하면 (HTTP 통신이 없음을 의미) 정상적으로 작동하기 때문입니다. –

+0

아, 그래. 스프레이 사용자 ml에 대해 물어 본 적이 있습니까? –

답변

0

로드 테스트 앱을 스프레이 프레임 워크로 이동했는데 이제는 매력처럼 작동합니다. 그래서 문제는 내가 플레이 프레임 워크에 WS API를 사용하는 방법으로 어딘가에이었다 가정 :

WS.url(server + "/track/message").post(Json.toJson(newUser)).map { response => 
    println(response.body) 
    true 
} 

문제는 resovled하지만 해결되지, 재생 기반으로하는 솔루션 작동하지 않습니다.

0

분산 및 병렬 환경에서 안정적으로 작동하는 시스템을 만드는 것은 불가능합니다. 어떤 디버깅 방법을 사용하든 디버그 세션 중에 발생할 수있는 몇 가지 버그 만 찾을 수 있습니다.

Google 팀이 강력한 24 시간 연중 무휴로 애플리케이션을 조정하는 동안 3 개월 (!)을 소비 했더니. 그리고 여전히 버그가있었습니다. 그런 다음 Model checking (Spin)의 방법을 적용했습니다. 몇 주 안에 우리는 견고한 응용 프로그램을 만들 수있는 모델을 구현했습니다. 그러나 모델 검사은 약간 다른 생각이 필요하며 시작하기가 어려울 수 있습니다.

+0

제 경우에는 3 개의 레이어가 모두 로컬로 실행됩니다. 즉, 잃어버린 패키지가 없어야합니다. 나는 메모리 제한과 타임 아웃이 있음을 인정하지만, 적어도 메시지를 떨어 뜨리는 원인을 알면 나를 도울 것입니다.나는 추가 테스트를하고 그것이 스프레이라고 알았습니다. <-> HTTP 파이프 (스프레이 게이트웨이가 사용되지 않음을 의미)를 사용하지 않고 모든 것이 스프레이 쪽에서 수행되면 단일 오류없이 100K + 레코드에서도 정상적으로 작동하므로 통신을 재생하십시오. –

관련 문제