2013-10-07 3 views
1

복제 나 샤딩 등과 같은 특별한 토폴로지가없는 단일 독립형 Mongo DB 서버를 사용 중입니다. 현재 mongo DB가 500 개 이상의 병렬 요청을 지원하지 않는다는 문제점이 있습니다. MongoClient 인스턴스를 하나만 사용하고 있으며 나머지 스레드는 삽입에 사용됩니다. Java Executor 프레임 워크를 사용하여 스레드를 만들고이 스레드를 사용하여 콜렉션에 데이터를 삽입합니다. [동일한 컬렉션의 모든 삽입]mongoDb에 여러 요청을 병렬 처리하는 방법은 무엇입니까?

답변

1

요청을 데이터베이스로 보내기 전에 큐에 대기시켜야합니다. 데이터베이스에서 500 가지를 병렬로 요청하는 용도는 없습니다. 단 하나의 요청은 메모리를 현명하게 잠그는 등의 방법으로 비용을 지불해야한다는 것을 기억하십시오. 실제로 데이터베이스를 너무 많이 요청하여 리소스를 낭비하고 있습니다. 즉 현명한 요청이 아니라 현명한 데이터를 의미합니다.

그래서 대기열 (이상)을 사용하고 요청을 저장하십시오. 그 수영장에서 당신은 당신의 작업자 스레드를 먹이려고합니다 (5 또는 10 정도이면 충분합니다).

Java의 동시 패키지에서 Future 인터페이스를 살펴보십시오. 여기서 asynchrone 처리를 사용하면 처리량이 가장 높고 자원 영향이 가장 적은 것으로 보입니다.

하지만 먼저 MongoDB 드라이버를 확인하십시오. 그들이 이미 이런 식으로 구현했다면 나는 놀라지 않을 것이다. 이 경우 대기열을 사용하여 데이터베이스 드라이버에서 한 번에 10 개 또는 100 개의 요청 만 처리하도록 제한해야합니다. 데이터베이스에 보내는 실제 요청 수를 조정하여 성능 점검을 수행하십시오.

+0

내가 READ에 대한 병렬 요청을 전송한다고 가정하면,이 경우 잠금이 없어야합니다. 병렬 읽기 요청의 경우 오버 헤드가 무엇입니까? – hershey92

+0

MongoDB는 각 요청 메모리에 일종의 오버 헤드를 첨부합니다. 당신이 무엇을하고 있느냐에 따라 때때로 mongodb은 동시에 여러 문서를 열고 다른 것들을 동시에 연기합니다. 일부 벤치마킹을 수행하십시오. 소규모 문서에 대해 저렴한 요청을하는 경우에는 검색 공간이 적지 만 검색이나 하위 트리를 읽는 것은 비용이 많이 듭니다. –

+0

그리고 mongodb는 CPUcores를 동시에 가지고있는 경향이 있으므로 추가 요청은 실제로는 속도를 높이지 않지만 추가 메모리를 사용하여 전체 응답 시간을 줄입니다. –

관련 문제