Worldbank–retry task if failure

Data trecuta am facut un benchmark pentru obtinerea datelor. Cind citeam de pe hard ( fisiere ) , era ok. Insa cind frameworkul de benchmark incepea sa solicite WorldBank API, acesta intorcea 500 ( internal server error)

Asa incit m-am hotarit ca ar trebui sa iau un framework de retry – daca da eroare serviciul , sa mai incerc de citeva ori.

Si am ajuns la Polly, https://github.com/App-vNext/Polly#asynchronous-support  . Codul este destul de simplu . Trebuie sa faca retry de 3 ori si sa logheze daca a fost vreo eroare si a cita eroare a fost.

Acesta este codul ( functia de downloadat se numeste DownloadData )

 

 

        public async Task<string> JsonData(int page = 1)
        {
            string req = "indicators?format=json" + ((page != 1) ? $"&page={page}" : "");
            Context c = new Context(req);
            
            var task = Policy
                .Handle<HttpRequestException>()
                .Or<WebException>()
                .WaitAndRetryAsync(3,
                    (t) => TimeSpan.FromSeconds(10),
                    (ex, ts, nr, context) =>
                    {
                        Console.WriteLine($"!!!{context["req"]} {DateTime.Now.ToString("HHmmss")}  retrying {nr} for error ");
                    }
                    )
                    .ExecuteAsync(async (ct) => 
                        {
                            ct["req"] = req;
                            return await DownloadData(req);
                        }
                        ,c);


            return await task;
                
        }

 

Am executat cu acelasi BenchMarkDotNet  – cu

[SimpleJob(launchCount: 1, warmupCount: 1,invocationCount:3,targetCount: 2, id: “QuickJob”)]

Acestea sunt rezultatele:

 

Pentru secvential:

Method Mean Error StdDev Gen 0 Gen 1 Gen 2 Allocated
GetIndicators 167.4 s NA 0.1202 s 77666.6667 17333.3333 1333.3333 11.82 KB

 

Pentru task

Method Mean Error StdDev Gen 0 Gen 1 Gen 2 Allocated
GetIndicators 4.025 s NA 0.5998 s 49333.3333 11833.3333 2333.3333 11.82 KB

 

Concluzii:

1. Se vede clar ca paralel e MULTmai bun decit secvential  ( 4 vs 167 secunde)

2. Paralel totusi poate da eroare la API ,daca e chemat prea rapid ( de aceea am facut retry)

3. Facind retry am rezolvat partial problema . Ar trebui sa fie si o BD de cache in care sa se tina raspunsurile ( ca acele fisiere de pe disk pe care le-am salvat dupa call ca sa fac unit test independente de http)