2011-12-04 2 views
4

저는 스칼라에서 웹 애플리케이션을 개발 중입니다. 클라이언트 (JSON 또는 ProtoBufs)의 포트에서 데이터를 가져와 데이터베이스 서버를 사용하여 계산을 수행 한 다음 JSON/Protobuf 객체로 클라이언트에 응답하는 간단한 애플리케이션입니다.자바/스칼라 리소스 소비 및로드

매우 무거운 응용 프로그램이 아닙니다. 최대 1000 줄의 코드 모든 클라이언트 요청마다 스레드가 생성됩니다. 요청을 받고 답장하는 데 걸리는 시간은 20 - 40ms 사이입니다.

초당 3000 이상의 요청을 처리하는 데 사용해야하는 하드웨어/설정의 종류에 대한 조언이 필요합니다. 내 데이터 센터에 배치하기 위해 하드웨어를 조달해야합니다.

대규모로 Java 응용 프로그램을 배포 한 경험이있는 사람은 누구나 조언을 구하십시오. 32GB RAM 또는 여러 개의 작은 컴퓨터가있는 2 - 4 Xeon 5500과 함께 하나의 큰 상자를 사용해야합니까?

업데이트 - 우리는 고객이 많지 않습니다. 그들 중 3 - 4 명 요청은이 중 3 개가됩니다.

+4

먼저 모든 클라이언트 요청에 스레드를 만들지 않음으로써 앱을 최적화하십시오. 스레드 풀을 사용하십시오. 그런 다음 측정하고 실험하십시오. –

+0

SoapUI 또는 유사한 도구를 사용하여로드를 측정 해 볼 수 있습니다. 이렇게하면 특정 유형의 시스템이 응용 프로그램에 필요한로드를 처리하는 방법을 테스트 할 수 있습니다. –

+0

업데이트를 잊어 버렸습니다. 이제 스레드에서 HTTP 파이프 라인을 사용하여 단일 소켓에서 여러 요청을 얻으려고합니다. 따라서 스레드 수는 줄여야합니다. –

답변

2

각 요청의 평균 소요 시간이 30ms 인 경우 단일 코어는 초당 30 개의 요청 만 처리 할 수 ​​있습니다. 앱이 선형으로 확장한다고 가정하면 (가장 좋은 시나리오가 예상 됨) 3000 req/s에 도달하려면 최소 100 개의 코어가 필요합니다. 2 ~ 4 제온 이상입니다. 당신이 응용 프로그램 IO 또는 DB (대부분의 유용한 응용 프로그램 등)에 의존하는 경우

최악의,

그래서 할 수있는 제일 먼저하는 것입니다 ... 당신은 sublinear 스케일링을 얻을 것이다 당신은 더 많이해야 할 수도 있습니다 응용 프로그램을 분석하고 최적화합니다. 여기에 몇 가지 도움말입니다 : 스레드를 생성

  • 것은 비싼, 스레드의 제한된 수를 생성하고 (자바 예를 들어 ExecutorService 참조) 요청 중 재사용하려고합니다.
  • 응용 프로그램이 IO 집중 형 인 경우 : 가능한 한 많은 IO 호출을 줄이고 메모리의 캐시를 사용하여 논 블로킹 IO를 시도하십시오.
  • 앱이 데이터베이스에 종속되어있는 경우 캐싱을 고려하고 가능한 경우 분산 솔루션을 사용해보십시오.
+0

네, 데이터베이스에 의존하고 있지만 병목 현상이 있어서는 안됩니다. 그 이유는 16GB RAM이있는 인근 머신에 10GB Redis 기반 키 값 저장이 있기 때문입니다. 따라서 DB 전체가 메모리에 있고 읽기가 빠릅니다. –

+0

병목 현상이 아닌지 반드시 측정해야합니다 ... (스레드 수를 줄이면 충분하지 않습니다) – paradigmatic

+0

클라우드를 사용하면 이러한 응용 프로그램에 적합하다고 생각합니까 ??? 또는 우리 자신의 클러스터를 사용해야합니다. ?? –