Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Артём Микулич «Как интегрироваться с (не-)надёжным third-party API при помощи Polly»

Артём Микулич «Как интегрироваться с (не-)надёжным third-party API при помощи Polly»

Интеграция с third-party сервисами дело неблагодарное. Когда мы делаем запросы в сторонний сервис, всегда есть вероятность, что что-то может пойти «не так» — отвалится сеть, сервис выбросит 429 Too Many Requests и т.д.

Зачастую мы не можем устранить причину таких проблем, но в наших силах минимизировать возникающий ущерб. Вы наверняка слышали о Retry-логике, кешировании, fallback-механизмах. До появления библиотеки Polly всё это мы изобретали сами. Но теперь у нас есть отличный инструмент, который сохранит наше время и нервы.

DotNetRu

July 23, 2020
Tweet

More Decks by DotNetRu

Other Decks in Programming

Transcript

  1. 2

  2. 3 • 429 - too many requests Possible root cause

    • Network lag • Dead lock • Server reboot • Other
  3. 8

  4. Agenda • Case #1: sporadic errors • Case #2: timeout

    • Case #3: dynamic policies • Case #4: caching • Advanced cases 9
  5. Retry 12 public void ConfigureServices(IServiceCollection services) { //... IAsyncPolicy<HttpResponseMessage> retry

    = Policy .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode) .RetryAsync(3); services.AddHttpClient<CrapyWeatherApiClient>((client) => {/* ... */}) .AddPolicyHandler(retry); }
  6. 15 Possible root cause • Network lag • Database lock

    • Server warms up • Other • Database stats reset
  7. 16

  8. Handle Timeout 17 var retry = Policy .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)

    .Or<TimeoutRejectedException>() .RetryAsync(3); var timeoutPolicy = Policy .TimeoutAsync(TimeSpan.FromSeconds(30), (ctx, t, task, e) => {/* ... */}); services.AddHttpClient<CrapyWeatherApiClient>((client) => {/* ... */}) .AddPolicyHandler(retry.WrapAsync(timeoutPolicy));
  9. 19 Case #3: dynamic policies • Specific url (e.g. /reports)

    • Http method (GET/POST/PUT) • Metrics (# of requests, date/time) • Other
  10. 20 Policy Registry var registry = services.AddPolicyRegistry(); registry.Add("RetryPolicy", policy); services.AddHttpClient<CrapyWeatherApiClient>((client)

    => {/* ... */}) .AddPolicyHandlerFromRegistry((policyRegistry, request) => { if (request.Method == HttpMethod.Get) { return registry.Get<IAsyncPolicy<HttpResponseMessage>>("RetryPolicy"); } return Policy.NoOpAsync<HttpResponseMessage>(); });