2014-01-19 3 views
3

의 데이터를 제공하여 내 문제의 해결 방법을 찾지 못했습니다.Netty, 연결된 클라이언트에게 mongo db

mongo db 데이터베이스에 저장되는 데이터 (정보)를 생성하는 백엔드 서버가 있습니다.

추가 서버 (실행중인 Netty)가 연결된 클라이언트 (10k 클라이언트)를 지원해야합니다.

모든 클라이언트가 동일한 정보에 관심이있는 것은 아니기 때문에 어디에서 데이터베이스 쿼리를 배치해야합니까?

나는 다음과 같은 아이디어를 내놓았다 : 데이터베이스 쿼리를 수행하고 연결된 모든 클라이언트를 통해 루핑 및 전송, 그물코 서버를 호스팅하는 응용 프로그램에서 별도의 스레드를 갖는

  • # 1 (channel.writeAndFlush (정보)) 정보 (클라이언트가 관심이 있다면).

첫 번째 문제점은 모든 클라이언트에게 서비스를 제공하는 스레드가 하나 밖에 없다는 것입니다. 둘째, 데이터베이스에서 많은 정보를 검색하고 관련 클라이언트가 연결되어 있지 않은 경우에도 응용 프로그램에 맞춰집니다. 나는 이것이 성능 문제로 이어질 수 있다고 생각한다.

  • # 2 (어쩌면 idlestatehandler?) 채널 스레드 내에서 훨씬 더 자세한 쿼리를 수행하고 모든

내가 더 나은 될 것이라고 개념을 알고 관심이 다시 클라이언트로 수신 된 데이터를 전송 확장 성과 성능.

이것은 일반적인 사용 사례입니다. 하지만 해결책을 찾지 못했습니다. 사전에

많은 감사

+0

귀하의 아이디어는 나에게 잘 들립니다. 어쩌면 채널 목록 대신 루프를 반복하지 않아도되는 간단한 데이터 목록 대신에 일부 데이터 구조를 유지할 수 있습니다. 당신의 아이디어에 어떤 다른 문제가 있습니까? – trustin

+0

@trustin, 나는 대신 하나의 큰 스레드가 데이터베이스를 쿼리하여 채널 스레드를 사용하고 필요한 데이터 만 쿼리 할 수 ​​있다고 생각했습니다. 그러나 그 코드를 어디에 두어야합니까? – Vincenzo

+0

@ user3211074 mongoDB에서 netty를 어떻게 사용했는지 알 수 있습니까? 사소한 질문으로 미안해, 나는 망할 놈이야? 또한 책이나 참고 자료를 더 잘 이해할 수 있도록 안내해 줄 수 있습니까? 미리 감사드립니다! – elgolondrino

답변

0

난 당신이 10K 클라이언트, 기본적으로 4 개의 CPU를 가정으로 당신이 스레드 당 1250 클라이언트를해야하기 때문에 채널 스레드를 사용하려는 생각하지 않는다 당신은되지 않습니다 mongo-db를 쿼리하는 동안 주어진 스레드에 바인드 된 모든 클라이언트에 데이터를 쓸 수 있습니다.

별도의 스레드 풀을 사용합니다. 각 채널에 대해 해당 채널에 대한 데이터를 검색하는 작업을 대기열에 올려 놓기 만하면됩니다. 쿼리가 반환되면 사용자 이벤트를 채널에 게시하여 I/O 스레드에서 쓰기를 수행 할 수 있습니다 (사용자 이벤트 필드 중 하나 인 '정보'게시). 이 방법을 사용하면 서버 용량 및 mongo-db에 대한 최대 연결 수 등을 고려하여 스레드 풀의 크기를 조정할 수 있습니다.

채널이 지속적이고 채널이 연결되어있는 동안 주기적으로 데이터를 폴링하는 경우 동일한 모델이 작동합니다. 일반 실행 프로그램 대신 ScheduledExecutorService를 사용하고 반복 할 작업을 예약하십시오.

쿼리가 실행되는 동안 채널을 처리해야합니다. 이벤트가 게시되기 전에 채널이 열려 있는지 확인하기보다는 실행 프로그램에 사용자 이벤트를 대기열에 넣으려고하면 Netty가 예외를 throw하는 경우가 드물게 발생합니다.

+0

감사합니다. 개념이 작동하는 것 같습니다. 이 디자인 패턴의 이름은 무엇입니까? – Vincenzo

+0

특정 패턴 이름이 있는지 확실하지 않습니다. "이벤트"가 처리를 위해 다음 스레드 풀로 전달되는 SEDA 요소를 공유하지만 완전히 동일하지는 않습니다. – johnstlr