0

선형 데이터 처리 루틴의 성능을 최적화하는 임무가 주어집니다. 다음은 이미 수행 된 작업에 대한 개요입니다.실시간 데이터 처리

데이터가 UDP 포트에 들어 오면 다른 포트에서 수신 대기하고 원시 데이터를 SQL Server 데이터베이스에 쓰거나 (RawData 테이블을 호출 할 수 있음) 데이터를 수신합니다. 그런 다음 RawData 테이블에서 원시 데이터를 가져 와서 개별 데이터row를 처리하는 단일 스레드 선형 응용 프로그램의 여러 인스턴스를 보유합니다. 어떤 처리가 의미하는 것은 원시 데이터가 주어진 엔티티에 대해 이전에 수신 된 데이터와 비교되고, 계산이 다른 판독 값의 수를 계산하기 위해 수행 된 다음 각 개별 데이터 행에 대해 몇 개의 웹 서비스가 호출되고 마지막으로 각 데이터에 대해 새 레코드가 추가된다는 것입니다. ProcessedData 테이블의 행. 또한 해당 엔티티 레코드가 다른 테이블에서 업데이트됩니다.

내가보기에 문제는 작은 부분으로 나눌 수 있으며 데이터 처리를 위해 생산자/소비자 패턴을 사용할 수 있습니다. 생산자 한 스레드가 공유 (차단) 대기열을 채우고 여러 소비자가 데이터 행을 가져옵니다. 대기열 및 병렬 처리를 수행합니다. 소비자는 처리 된 데이터를 다른 공유 대기열에 저장 한 다음 SqlBulkCopy를 사용하여 새로운 레코드를 삽입하는 또 다른 소비자 스레드 (단일)가 액세스합니다. 이 과정에서 업데이트에 대한 엔티티 정보를 저장할 다른 공유 대기열이 있으며 또 다른 소비자는 엔티티에 대한 업데이트 된 정보를 수집하고 업데이트를 수행합니다.

질문은 곧장 앞으로 나올 것으로 보이지만, 성가신 접근법으로 보입니다. 나는 내가 원하는 것을하는 더 좋은 방법이 있다고 느낍니다. 위의 프로듀서/소비자 패턴 구현에 대한 제안 사항은 무엇입니까? 또는 내 문제에 대해 다른 디자인 패턴을 찾아야합니까? 사전에

감사

+0

, 당신은 "큐를 공유"의미합니까? –

+0

예, 제 잘못입니다. 그것을 알아 줘서 고마워. 수정 됨 – Dimitri

답변

2

귀하의 제안 솔루션은 합리적인 소리, 나는 모두가 같은 성가신 볼 수 없습니다. 이해하기 쉽고, 구현하기 쉽고, 효과적이고 효율적입니다. 또한 최상의 성능을 얻기 위해 생산자와 소비자의 수를 조정할 수 있습니다. 부품 간의 통신이 제한되어있는 작은 부품으로 분해하는 것은 매우 좋은 일입니다.

그래서 당신은 UDP로부터 데이터를 읽고 공유 큐에 저장하는 여러 스레드 (생산자)가 있습니다. RawData 대기열이라고합니다. 여러 사용자가 대기열에서 읽고 항목을 처리하고 결과를 다른 공유 대기열에 배치합니다. ProcessedData 대기열이라고합니다. 마지막으로 ProcessedData 큐를 읽고 데이터베이스에 항목을 저장하는 단일 스레드가 있습니다.

.NET BlockingCollection은 이에 적합합니다.

이 약간의 도움이 될 수 있습니다 Question on C# threading with RFID는 "쿼리를 공유"말

+0

짐에게 답장을 보내 주셔서 감사합니다. 예, 어떤 유형의 대기열이 내 필요에 가장 잘 맞을지에 관해서 나뉘 었습니다. 잠금 시간을 최소화하기 위해 순환 대기열 또는 이중 버퍼를 사용할 것을 고려하고있었습니다. 나는 우리가 처리 할 데이터가별로 없다는 것을 알고 있지만, 나는 항상 확장 성을 생각하고있다. 나는 트래픽이 올라 갔을 때 돌아가서 앱을 다시 작성하는 것을 싫어한다. – Dimitri

+0

BlockingCollection에 약간의 문제가 있습니다. ConcurrentQueue를 콜렉션베이스로 구현하고 있지만, 소비자를 위해 다중 스레드를 추가 할 때 대기열에서 항목을 연속적으로 가져 오는 것을 보장하지는 않습니다. Parallel.Foreach와 Parallel을 시도했습니다. 그들은 둘 다 항목의 순서를 존중하지 않는 것 같습니다. 그런 다음 Task.StartNew를 시도했는데 시퀀스를 존중하는 것 같습니다. 또한 소비자의 출력물을 주문해야하는 또 다른 대기열에 보관해야합니다. 동일한 BlockingCollection을 사용하고 .OrderBy를 실행할 수 있습니까?또는 ID가 SortedList를 사용하고 수동으로 잠금을 처리하는 것이 더 좋을까요? – Dimitri

+0

@Dimitri : 많은 문제를 해결할 수 있습니다. 다른 질문으로 게시하는 것이 가장 좋습니다. –

관련 문제