2017-10-11 3 views
0

TPL을 많이 사용하고 있으며 큰 데이터 흐름 파이프 라인 구조를 가지고 있습니다.
파이프 라인 네트워크의 일부로 푸른 색 얼룩 저장 장치에 일부 데이터를 쓰려고합니다. 우리는 많은 데이터를 가지고 있으므로 4 스토리지 계정이 있고 그 사이에 데이터를 균등하게 분배하려고합니다.TPL 라운드 로빈 링크가있는 블록?

데이터 흐름 파이프 라인 패턴을 계속 사용하고자하므로 SourceBlock을 구현하고 싶습니다. 여러 대상 블록에 연결하면 라운드 로빈을 사용하여 메시지를 보내 게됩니다. BufferBlock은 메시지를 허용하는 첫 번째 블록으로 메시지를 보내고 모든 대상 블록이 큰 용량을 가진다고 가정하기 때문에 충분하지 않습니다. 모든 메시지는 첫 번째 대상 블록으로 이동합니다. BroadcastBlock도 좋지 않습니다. 중복을 원하지 않기 때문입니다.

어떤 권장 사항이 있습니까? 라운드 로빈 동작과 함께 ISourceBlock 인터페이스를 구현하는 것이 그렇게 간단하지 않은 것 같아서 거기에 간단한 솔루션이 있는지 궁금해했습니다. 또는 내가 익숙하지 않은 TPL의 확장?

답변

0

link the blocks with a predicate에 대해 알고 계십니까? 출력의

var buffer = new BufferBlock<int>(); 
var consumer1 = new ActionBlock<int>(i => Console.WriteLine($"First: {i}")); 
var consumer2 = new ActionBlock<int>(i => Console.WriteLine($"Second: {i}")); 
var consumer3 = new ActionBlock<int>(i => Console.WriteLine($"Third: {i}")); 
var consumer4 = new ActionBlock<int>(i => Console.WriteLine($"Forth: {i}")); 

buffer.LinkTo(consumer1, i => Predicate(0)); 
buffer.LinkTo(consumer2, i => Predicate(1)); 
buffer.LinkTo(consumer3, i => Predicate(2)); 
buffer.LinkTo(consumer4, i => Predicate(3)); 
buffer.LinkTo(DataflowBlock.NullTarget<int>()); 

for (var i = 0; i < 10; ++i) 
{ 
    buffer.Post(i); 
} 
buffer.Completion.Wait(); 

하나 :이 샘플에 대한 매우 간단한 아니라 잘 테스트 솔루션입니다

Third: 2 
First: 0 
Forth: 3 
Second: 1 
Second: 5 
Second: 9 
Third: 6 
Forth: 7 
First: 4 
First: 8 
당신이 작업의 수를 유지하고있다 여기에서 벌어지고

, 현재의 경우 소비자에게 적합합니다. 메모리 문제를 피하기 위해 적어도 한 번 이상 술어가없는 블록을 링크해야합니다 (또한 손실 된 메시지를 모니터링하는 블록으로 라운드 로빈을 테스트하는 것이 좋습니다).

+0

감사합니다. VMAtm. 이전에 술어를 통과 시키려 한 적이 없었고 샘플에서 많은 것을 배웠습니다. 내 사건에 적용 할 수 있는지 아직 확실하지 않습니다. 그러나 완전히 이해하지 못했기 때문에 무언가를 놓칠 수도 있습니다. 그래서 한 가지 질문 - "* 기억 문제를 피하기 위해 적어도 한번은 술어가없는 블록을 연결해야한다는 것을 기억하십시오." 기억의 문제점을 말씀해 주시겠습니까? – Zorik

+0

내가 말했듯이,이 코드는 제대로 테스트되지 않았고, 어쩌면 모든 상황이 거짓이되는 상황이있을 수 있습니다. 그 후 메시지는 프로그램이 끝날 때까지'BufferBlock'에 남아있을 것입니다. biffer를 떠나기 위해 "bad"메시지에 대한 블록을 만드는 것이 일반적입니다. 'NullTarget'은 단순히 메시지를 무시하지만 원하는 블록을 사용하고 모든 술어 누락을 로그 할 수 있습니다. – VMAtm

+0

감사합니다. – Zorik