簡體   English   中英

使用多個BlockingCollection <T> 實現管道驗證的緩沖區

[英]Using multiple BlockingCollection<T> buffers in implementing pipeline validation

因此,我需要讀取一個大數據文件的每個記錄(行),然后在這些行中的每一個上應用各種驗證規則。 因此,我決定不只是應用順序驗證,而決定是否可以使用一些流水線來幫助加快處理速度。 因此,我需要對集​​合中的所有項目應用相同的一組業務驗證規則(目前為5個)。 由於不需要從每個驗證過程返回輸出,因此我不必擔心將值從一個驗證例程傳遞到另一個驗證例程。 但是,我確實需要使所有驗證步驟都可以使用相同的數據,並且要做到這一點,我想出了將相同的數據(記錄)處理到5個不同的緩沖區的方法,每個驗證階段都將使用這些緩沖區。

以下是我要執行的代碼。 但是我對此應用缺乏信心,想知道是否有更好的方法可以做到這一點? 感謝您可以為此提供的任何幫助。 提前致謝。

public static void LoadBuffers(List<BlockingCollection<FlattenedLoadDetail>> outputs,
            BlockingCollection<StudentDetail> students)
        {
            try
            {
                foreach (var student in students)
                {
                    foreach (var stub in student.RecordYearDetails)
                        foreach (var buffer in outputs)
                            buffer.Add(stub);
                }
            }
            finally
            {
                 foreach (var buffer in outputs)
                     buffer.CompleteAdding();
            }

        }


    public void Process(BlockingCollection<StudentRecordDetail> StudentRecords)
    {

        //Validate header record before proceeding

        if(! IsHeaderRecordValid)
            throw new Exception("Invalid Header Record Found.");
        const int buffersize = 20;
        var buffer1 = new BlockingCollection<FlattenedLoadDetail>(buffersize);
        var buffer2 = new BlockingCollection<FlattenedLoadDetail>(buffersize);
        var buffer3 = new BlockingCollection<FlattenedLoadDetail>(buffersize);
        var buffer4 = new BlockingCollection<FlattenedLoadDetail>(buffersize);
        var taskmonitor = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.NotOnCanceled);

        using (var loadUpStartBuffer = taskmonitor.StartNew(() => LoadBuffers(
            new List<BlockingCollection<FlattenedLoadDetail>>
            {buffer1, buffer2, buffer3, buffer4}, StudentRecords)))
        {
            var recordcreateDateValidationStage = taskmonitor.StartNew(() => ValidateRecordCreateDateActivity.Validate(buffer1));
            var uniqueStudentIDValidationStage =
                taskmonitor.StartNew(() => ValidateUniqueStudentIDActivity.Validate(buffer2));
            var SSNNumberRangeValidationStage =
                taskmonitor.StartNew(() => ValidateDocSequenceNumberActivity.Validate(buffer3));
            var SSNRecordNumberMatchValidationStage =
                taskmonitor.StartNew(() => ValidateStudentSSNRecordNumberActivity.Validate(buffer4));

            Task.WaitAll(loadUpStartBuffer, recordcreateDateValidationStage, uniqueStudentIDValidationStage,
                SSNNumberRangeValidationStage, SSNRecordNumberMatchValidationStage);

        }
    }

實際上,如果我能夠以這樣一種方式來捆綁任務:一旦一個失敗,所有其他任務都停止了,那將對我有很大幫助,但是我是這種模式的新手,並且可以嘗試找出解決該問題的最佳方法問題在這里。 我是否應該謹慎行事,並讓每個驗證步驟都加載要傳遞給后續任務的輸出緩沖區? 這是更好的方法嗎?

您需要自己回答的第一個問題是您是否要提高延遲或吞吐量。

您所描述的策略采用單個項目並對其進行並行計算。 這意味着一個物品的維修速度非常快,但是卻以其他物品的輪換為代價。

考慮另一種並行方法。 您可以將整個驗證過程視為順序操作,但可以同時並行處理多個項目。

在我看來,從您的情況來看,您將從后一種方法中受益匪淺,尤其是從簡單性的角度出發,並且由於我猜想延遲在這里並不那么重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM