확장 성 및 처리에 문제가 있으며 스택 오버 플로우 커뮤니티에 대한 의견을 얻고 싶습니다.스레드를 통해 C# 처리 된 소켓 데이터
기본적으로 XML 데이터가 소켓에 연결되어 있고 그 데이터를 처리하려고합니다. 전송 된 각 XML 행마다 처리에는 텍스트 파일에 쓰기, 다른 서버에 대한 소켓 열기 및 다양한 데이터베이스 조회 사용이 포함될 수 있습니다. 모두 시간이 걸립니다.
내 솔루션에 다음과 같은 스레드가 포함됩니다. 스레드 1 들어오는 소켓을 받아들이고 따라서 각 소켓을 처리하는 하위 스레드를 생성합니다 (클라이언트로부터 몇 개의 들어오는 소켓 만있을 것입니다). XML 라인이 (StreamReader의 ReadLine() 메소드를 통해) 나왔을 때 기본적으로 클래스의 정적 메소드를 통해 액세스 할 수있는 Queue에이 라인을 넣습니다. 이 정적 메서드에는 프로그램이 스레드 안전성을 보장하는 잠금 논리가 포함되어 있습니다 (물론 수동 잠금 대신 Concurrent Queue를 사용할 수 있습니다).
스레드 2-5 지속적으로 XML 행을 대기열에서 가져 와서 한 번에 하나씩 처리합니다 (데이터베이스 쿼리, 파일 쓰기 등).
이 방법은 효과가있는 것처럼 보입니다. 그러나이 방법은 매우 미숙 한 방법이므로 더 좋은 방법이 있는지 궁금합니다. 스레드 2-5가 스레드 1로 처리하는 작업을 수행하면 성능이 매우 느려지므로 예상 한대로 작업자 스레드 (2-5)를 만들었습니다.
스레드 풀로 스레드 2-5를 대체 할 수 있지만 스레드 풀은 여전히 동일한 대기열의 XML 행에서 읽히기 때문에 감사합니다. 그래서 대신에 이러한 이벤트를 처리하는 대신 효율적으로 처리하는 방법이 있습니다. 열?
안녕하세요 Richard, 답장을 보내 주셔서 감사합니다. 어쨌든 스레드 풀과 ConcurrentQueue로 이동하려고했습니다. 처음 메시지를 게시 한 후 약 30 분 후에 메시지 대기열을 발견하고 AMQP, STOMP, MSMQ 및 RabbitMQ 및 ActiveMQ와 같은 다양한 프로그램을 연구하기 시작했습니다. 메시지 대기열 프로그램을 사용 했습니까? 특별히 추천 해 주시겠습니까? – user1593436
@ user1593436 필자는 여러 사람의 래퍼를 여러 개 사용했습니다. 그러나 최근에는 없습니다. 통합을 감안할 때 MSMQ부터 시작 하겠지만 추상화를 작성하여 어느 하나의 잠금을 피하십시오 (이는 가짜 입력 대기열을 사용하여 단위 테스트를 허용 할 수도 있음). – Richard