<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Resilience | The .NET Blog</title><link>https://thedotnetblog.com/pl/tags/resilience/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>pl</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Thu, 21 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/pl/tags/resilience/index.xml" rel="self" type="application/rss+xml"/><item><title>Przestań Atakować Zmagającą się Zależność: Wzorce Retry dla Azure Functions + Service Bus</title><link>https://thedotnetblog.com/pl/news/emiliano-montesdeoca/azure-functions-service-bus-exponential-backoff-circuit-breaker/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/news/emiliano-montesdeoca/azure-functions-service-bus-exponential-backoff-circuit-breaker/</guid><description>Wzorce exponential backoff i circuit breaker są teraz obsługiwane natywnie dla Azure Functions wyzwalanych przez Service Bus — oto jak działają i dlaczego potrzebujesz obu.</description><content:encoded>&lt;p&gt;Oto jak odwracalna awaria staje się przestojem w aplikacji Functions: zależność zaczyna dawać timeout, każda instancja Functions natychmiast i bezterminowo ponawia próby, zależność jest bombardowana setkami równoczesnych nieudanych żądań, i to, co zaczęło się jako przejściowy problem, staje się ogólnosystemowym zdarzeniem przeciwciśnienia.&lt;/p&gt;
&lt;p&gt;Pewnie znasz tę historię. Azure Functions szybko skaluje się — o to w tym wszystkim chodzi. Ale &amp;ldquo;szybkie skalowanie&amp;rdquo; i &amp;ldquo;natychmiastowe ponawianie&amp;rdquo; razem mogą dramatycznie pogorszyć awarie.&lt;/p&gt;
&lt;p&gt;Dwa wzorce pomagają. Exponential backoff i circuit breaker. Oba są teraz obsługiwane natywnie dla Azure Functions wyzwalanych przez Service Bus.&lt;/p&gt;
&lt;h2 id="dwa-wzorce-różne-role"&gt;Dwa Wzorce, Różne Role&lt;/h2&gt;
&lt;p&gt;Te wzorce są komplementarne, nie alternatywne:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exponential backoff&lt;/strong&gt; odpowiada: &lt;em&gt;kiedy powinienem spróbować ponownie?&lt;/em&gt;
Zwiększa opóźnienie między próbami, aby zależność miała czas na odzyskanie. Na poziomie wiadomości, regulując tempo retry.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Circuit breaker&lt;/strong&gt; odpowiada: &lt;em&gt;czy powinienem w ogóle teraz wywoływać tę zależność?&lt;/em&gt;
Zatrzymuje powtarzające się wywołania do niezdrowej zależności po osiągnięciu progu awarii, a następnie ostrożnie sonduje po okresie ochłodzenia. Na poziomie systemu, zapobiegając burzom retry.&lt;/p&gt;
&lt;p&gt;Chcesz obu. Backoff obsługuje tempo ponownych prób na wiadomość. Circuit breaker obsługuje zagregowane decyzje zdrowotne.&lt;/p&gt;
&lt;h2 id="dlaczego-jest-to-szczególnie-ważne-dla-service-bus"&gt;Dlaczego Jest To Szczególnie Ważne dla Service Bus&lt;/h2&gt;
&lt;p&gt;Kolejka absorbuje ruch seryjny, co jest dobre. Ale bez kontroli kolejka może rosnąć, podczas gdy workerzy nadal marnują zasoby obliczeniowe na wywołania, które nie powiedzie się. Toksyczne wiadomości pozostają aktywne dłużej niż powinny. Gorące partycje lub ograniczona pojemność downstream tworzą kaskadowe problemy.&lt;/p&gt;
&lt;p&gt;Bezpieczniejszy projekt:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Wykryć przejściową awarię&lt;/li&gt;
&lt;li&gt;Opóźnić następną próbę z exponential backoff&lt;/li&gt;
&lt;li&gt;Zatrzymać wywołania do zależności po osiągnięciu progu awarii (obwód otwarty)&lt;/li&gt;
&lt;li&gt;Ostrożnie wznowić po okresie ochłodzenia (sonda obwodu)&lt;/li&gt;
&lt;li&gt;Przenieść nieodwracalną pracę do dead-letter lub ścieżki kwarantanny&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="jak-wygląda-natywne-wsparcie"&gt;Jak Wygląda Natywne Wsparcie&lt;/h2&gt;
&lt;p&gt;Nowe wsparcie integruje się z istniejącym modelem hosta Azure Functions — bez dodatkowych bibliotek, bez niestandardowych implementacji. Konfiguracja trafia do Twojego &lt;code&gt;host.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;extensions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;serviceBus&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;messageHandlerOptions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;maxRetryCount&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;retryPolicy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;exponentialBackoff&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;minBackoff&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;00:00:02&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;maxBackoff&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;00:05:00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;maxRetryCount&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Konfiguracja circuit breakera ustawia próg awarii i interwał resetowania, aby niezdrowe zależności nie były bombardowane podczas odzyskiwania.&lt;/p&gt;
&lt;h2 id="obsługiwane-języki"&gt;Obsługiwane Języki&lt;/h2&gt;
&lt;p&gt;To nie tylko dla .NET. Funkcja obejmuje dotnet, JavaScript, TypeScript i Python — pełny zestaw języków obsługiwanych przez wyzwalacz Service Bus w Azure Functions.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Wzorce retry nie są ekscytujące do konfigurowania do pierwszego razu, gdy awaria downstream powoduje, że Twoje Functions pogłębiają problem zamiast degradować się łagodnie. Konfigurowanie ich proaktywnie jest tanie. Dostosowywanie ich podczas incydentu takie nie jest.&lt;/p&gt;
&lt;p&gt;Oryginalny post: &lt;a href="https://devblogs.microsoft.com/azure-sdk/exponential-backoff-circuit-breaker-azure-functions/"&gt;Exponential backoff and circuit breaker for Service Bus-triggered Azure Functions&lt;/a&gt;&lt;/p&gt;</content:encoded></item></channel></rss>