2013-09-05 1 views
0

확장 성 및 처리에 문제가 있으며 스택 오버 플로우 커뮤니티에 대한 의견을 얻고 싶습니다.스레드를 통해 C# 처리 된 소켓 데이터

기본적으로 XML 데이터가 소켓에 연결되어 있고 그 데이터를 처리하려고합니다. 전송 된 각 XML 행마다 처리에는 텍스트 파일에 쓰기, 다른 서버에 대한 소켓 열기 및 다양한 데이터베이스 조회 사용이 포함될 수 있습니다. 모두 시간이 걸립니다.

내 솔루션에 다음과 같은 스레드가 포함됩니다. 스레드 1 들어오는 소켓을 받아들이고 따라서 각 소켓을 처리하는 하위 스레드를 생성합니다 (클라이언트로부터 몇 개의 들어오는 소켓 만있을 것입니다). XML 라인이 (StreamReader의 ReadLine() 메소드를 통해) 나왔을 때 기본적으로 클래스의 정적 메소드를 통해 액세스 할 수있는 Queue에이 라인을 넣습니다. 이 정적 메서드에는 프로그램이 스레드 안전성을 보장하는 잠금 논리가 포함되어 있습니다 (물론 수동 잠금 대신 Concurrent Queue를 사용할 수 있습니다).

스레드 2-5 지속적으로 XML 행을 대기열에서 가져 와서 한 번에 하나씩 처리합니다 (데이터베이스 쿼리, 파일 쓰기 등).

이 방법은 효과가있는 것처럼 보입니다. 그러나이 방법은 매우 미숙 한 방법이므로 더 좋은 방법이 있는지 궁금합니다. 스레드 2-5가 스레드 1로 처리하는 작업을 수행하면 성능이 매우 느려지므로 예상 한대로 작업자 스레드 (2-5)를 만들었습니다.

스레드 풀로 스레드 2-5를 대체 할 수 있지만 스레드 풀은 여전히 ​​동일한 대기열의 XML 행에서 읽히기 때문에 감사합니다. 그래서 대신에 이러한 이벤트를 처리하는 대신 효율적으로 처리하는 방법이 있습니다. 열?

답변

0

대기열 이 올바른 접근 방식입니다. 하지만 수동 스레드 제어에서 스레드 풀로 이동할 것이므로 스레드 관리를 수행 할 필요가 없으므로 스레드 수를 관리 할 수 ​​있습니다.

그러나 결국은 단일 컴퓨터 (비싸지 만)가 처리 할 수있는 처리량이 너무 많습니다. 어떤 시점에서 메모리 크기, CPU 메모리 대역폭, 스토리지 IO, 네트워크 IO 중 하나가 포화 상태가됩니다. 이 때 각 작업이 별도의 메시지 인 외부 큐 시스템 (MSMQ, WebSphere * MQ, Rabbit-MQ 등)을 사용하면 많은 컴퓨터의 많은 작업자가 데이터를 처리 할 수 ​​있습니다 ("경쟁 소비자"패턴).


1 내가 ConcurrentQueue로 즉시 이동할 것 : 바로 잠금 점점 단단하다, 더 필요하지 않은 자신이 더 나은 그것을 할 수 있습니다.

사용자 지정 스레드 풀로 전환 할 때 스레드 풀 공급자보다 많은 제어가 필요한 경우가 있습니다. 그러나 프로토 타입과 테스트 : 구현이 실제로 악화 될 가능성이 매우 높습니다. 단락 2를 참조하십시오.

+0

안녕하세요 Richard, 답장을 보내 주셔서 감사합니다. 어쨌든 스레드 풀과 ConcurrentQueue로 이동하려고했습니다. 처음 메시지를 게시 한 후 약 30 분 후에 메시지 대기열을 발견하고 AMQP, STOMP, MSMQ 및 RabbitMQ 및 ActiveMQ와 같은 다양한 프로그램을 연구하기 시작했습니다. 메시지 대기열 프로그램을 사용 했습니까? 특별히 추천 해 주시겠습니까? – user1593436

+0

@ user1593436 필자는 여러 사람의 래퍼를 여러 개 사용했습니다. 그러나 최근에는 없습니다. 통합을 감안할 때 MSMQ부터 시작 하겠지만 추상화를 작성하여 어느 하나의 잠금을 피하십시오 (이는 가짜 입력 대기열을 사용하여 단위 테스트를 허용 할 수도 있음). – Richard

관련 문제