2009-04-18 4 views
3

저는 하드웨어 인터페이스 용 임베디드 시스템 및 시스템 프로그래밍에서 현재까지 에서 일했습니다. 재미 있고 개인적인 지식을 위해 최근 Erlang에 손을 묻힌 후 서버 프로그래밍에 대해 더 자세히 배우려고했습니다. 나는 C++/Java 장래성에서 서버에 대해 생각해 왔으며 이제 C++이나 Java와 같은 기술로 확장 가능한 시스템을 구축 할 수 있는지 궁금합니다.서버 설계 및 구현

컨텍스트 스위칭 및 제한된 메모리로 인해 클라이언트 당 스레드 처리기가 현실적이지 않음을 읽었습니다. 일반적으로 스레드 풀이 만들어지고 작업자 스레드와 비동기 I/O가 혼합되어 요청을 처리합니다. 무엇보다도 스레드 풀 크기를 어떻게 결정합니까? 최적의 균형을 측정하고 찾아야 만합니까? 결국 시스템이 확장 될 때 요청을 처리하는 데 하나 이상의 서버가 필요할 수 있습니다. 대형 클라이언트 기반을 처리하는 여러 서버에서 요청을 어떻게 관리합니까?

나는 더 많은 것을 읽고 제 질문에 대한 답을 찾을 수있는 방향을 찾고 있습니다. 이 영역에서 컴퓨터 과학의 어떤 영역을 조사하면 더 많은 정보를 얻을 수 있습니까? 이 컴퓨팅 영역을위한 디자인 패턴이 있습니까?

+0

이 질문에 감사하지만 어쩌면 4 개 또는 5 개의 questons가 하나에 싸여 있습니다. – ojblass

답변

1

for C++ 저는 boost :: asio를 사용했습니다. 매우 현대적인 C++이며 작업하기가 아주 쉽습니다. 또한 C++ 0x 네트워크 라이브러리는 ASIO의 구현을 기반으로하므로 가치있는 지식입니다.

클라이언트 당 1 스레드 디자인은 이미 배운 것처럼 작동하지 않습니다. 고성능 멀티 스레딩의 경우 최적의 스레드 수는 CoresX2 인 것처럼 보이지만 서버의 경우 요청 당 IO가 많아 유휴 대기가 많습니다. 그리고 경험상 아파치, MySQL, 오라클을 보면 스레드 수는 데이터베이스 서버의 경우 CoresX10, 웹 서버의 경우 CoresX40에 대한 것이지 이상적인 것은 아니지만 시스템의 패턴처럼 보입니다. 따라서 시스템 당신은 당신의 디자인이 완전히 형편없는 것은 아님을 알게 될 것입니다.

3

귀하의 질문에 답변이 너무 일반적입니다. 대답은 문맥, 하나의 스레드가 처리하는 양, 요청이 얼마나 빨리 도착하는지, 사용중인 CPU 패밀리, 사용중인 웹 컨테이너 및 기타 많은 요인에 따라 크게 달라집니다.

1

Lothar와 마찬가지로 우리는 비동기 이벤트 및 비동기 I/O (C++ 코드)를 처리하기위한 reactor 및 proactor 패턴을 포함하는 ACE 라이브러리를 사용합니다. 우리는 필요에 따라 (구성 가능한 최대까지) 커지고 시간이 지남에 따라 축소되는 상당한 작업자 스레드 풀을 사용합니다.

C++의 트릭 중 하나는 네트워크 경계 (예 : 언어로 처리되지 않음)에서 예외 및 오류 상황을 전파하는 방법입니다. .NET에서 이러한 네트워크 경계를 넘어 예외를 throw하는 방법이 있다는 것을 알고 있습니다.

고차원 분산 시스템 문제를 처리하기 위해 SOA (Service Oriented Architecture)를 고려해야합니다. ACE는 실제로 기계의 베어 메탈에서 작동합니다.

관련 문제