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)