2011-01-19 6 views
2

문제점 : 네트워크를 통해 직렬화 및 전송할 많은 수의 큰 메시지가 있습니다. 성능을 극대화하고 싶습니다. 따라서 메시지 직렬화를위한 다중 스레드와 데이터 전송을위한 하나의 스레드를 생성하려고합니다. 아이디어는 네트워크 성능에 따라 직렬화를위한 스레드 수를 동적으로 결정하는 것입니다. 데이터가 빠르게 전송되고 직렬화에 병목 현상이있는 경우 직렬화를 높이기 위해 더 많은 스레드를 추가하십시오. 네트워크가 느린 경우 쓰레드를 적게 사용하고 송신 버퍼가 가득 차면 완전히 중지하십시오.C#의 다중 스레드 직렬화

아이디어가 있습니까?

더 많거나 적은 스레드가 필요한지 결정하는 가장 좋은 알고리즘은 무엇입니까?

여러 스레드의 직렬화 결과를 올바르게 연결하는 방법은 무엇입니까?

이 질문에 답하십시오. 감사합니다

+0

당신은 성능에 관심이 있다고 언급합니다. 실제로 쓰레드에 대한 직접적인 대답은 아니지만, 현재 사용중인 시리얼 라이저를 아는 데 매우 관심이 있습니다 ... 특히, 나는 찾고있을 것입니다. protobuf-net (무료이지만 공개 : 나는 그것을 썼다.)은 내장 된 어떤 시리얼 라이저보다 훨씬 더 빠르며 (CPU/IO) 대역폭이 더 작다. –

+0

현재 BinaryFormatter를 사용하고 있습니다. 나는 protobuf에서 전환을 계획했다. 예상치는 언제 V2가 생산 준비가 되나요? – Marko

+0

주 .NET Framework에서 가장 일반적인 시나리오의 경우 트렁크가 안정적입니다. 나는 다른 (약속 안함) 약속이 있기 때문에 구체적인 날짜를 약속 할 수 없다. 또한 v1은 꽤 강력하게 작동합니다 ... –

답변

2

생산자/소비자 문제로 처리 될 수 있습니다. Fx4에서는 BlockingCollection을 사용할 수 있습니다.

솔직히 말해서 (네트워크) I/O가 직렬화가 아니라 병목 현상이 될 것으로 기대합니다. 당신은 측정해야합니다.

1

데이터를 패킷으로 청크 (chunk)하여 큐에 넣을 수 있습니다. 네트워크 성능을 살펴 보는 프로세스는 대기열을보고 전송할 패킷 수를 결정합니다. 이 구현의 단점은 올바른 순서로 수신되지 않을 수있는 수신 측에서 패킷을 어셈블해야한다는 것입니다.