<?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/ar/tags/resilience/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>ar</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/ar/tags/resilience/index.xml" rel="self" type="application/rss+xml"/><item><title>توقف عن قصف تبعية تعاني: أنماط إعادة المحاولة لـ Azure Functions + Service Bus</title><link>https://thedotnetblog.com/ar/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/ar/news/emiliano-montesdeoca/azure-functions-service-bus-exponential-backoff-circuit-breaker/</guid><description>أنماط الانسحاب الأسي وقاطع الدائرة مدعومان الآن بشكل أصلي لـ Azure Functions المشغَّلة بـ Service Bus — إليك كيفية عملها ولماذا تحتاج كليهما.</description><content:encoded>&lt;p&gt;إليك كيف تتحول الحالة القابلة للاسترداد إلى انقطاع في تطبيق Functions: تبدأ تبعية في انتهاء المهلة، تعيد كل مثيل Functions المحاولة فوراً وبصورة غير محددة، تتلقى التبعية مئات الطلبات المتزامنة الفاشلة، وما بدأ كعائق مؤقت يتحول إلى حدث ضغط عكسي على مستوى النظام.&lt;/p&gt;
&lt;p&gt;ربما تعرف هذه القصة. يتوسع Azure Functions بسرعة — هذا هو كل الهدف. لكن &amp;ldquo;التوسع السريع&amp;rdquo; و&amp;quot;إعادة المحاولة الفورية&amp;quot; معاً يمكن أن يجعلا الإخفاقات أسوأ بشكل درامي.&lt;/p&gt;
&lt;p&gt;نمطان يساعدان. الانسحاب الأسي وقاطع الدائرة. كلاهما مدعومان الآن بشكل أصلي لـ Azure Functions المشغَّلة بـ Service Bus.&lt;/p&gt;
&lt;h2 id="نمطان-أدوار-مختلفة"&gt;نمطان، أدوار مختلفة&lt;/h2&gt;
&lt;p&gt;هذان النمطان متكاملان، وليسا بديلين:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;الانسحاب الأسي&lt;/strong&gt; يجيب على: &lt;em&gt;متى يجب أن أحاول مرة أخرى؟&lt;/em&gt;
يزيد من التأخير بين المحاولات حتى تتاح للتبعية وقتاً للتعافي. على مستوى الرسالة، يضبط توقيت إعادة المحاولة.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;قاطع الدائرة&lt;/strong&gt; يجيب على: &lt;em&gt;هل يجب أن أستدعي هذه التبعية الآن؟&lt;/em&gt;
يوقف الاستدعاءات المتكررة لتبعية غير صحية بعد الوصول إلى حد الفشل، ثم يستكشف بحذر بعد فترة تهدئة. على مستوى النظام، يمنع عواصف إعادة المحاولة.&lt;/p&gt;
&lt;p&gt;تحتاج كليهما. يتعامل الانسحاب مع توقيت إعادة المحاولة لكل رسالة. يتعامل قاطع الدائرة مع قرارات الصحة المجمّعة.&lt;/p&gt;
&lt;h2 id="لماذا-هذا-مهم-بشكل-خاص-لـ-service-bus"&gt;لماذا هذا مهم بشكل خاص لـ Service Bus&lt;/h2&gt;
&lt;p&gt;تستوعب قائمة الانتظار حركة المرور المتدفقة، وهذا أمر جيد. لكن بدون ضوابط، يمكن أن تنمو قائمة الانتظار بينما تستمر العمال في إهدار موارد الحوسبة على استدعاءات ستفشل. تظل الرسائل المسمومة نشطة لفترة أطول مما ينبغي. تخلق الأقسام الساخنة أو القدرة المحدودة في المصب مشكلات متتالية.&lt;/p&gt;
&lt;p&gt;التصميم الأكثر أماناً:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;اكتشاف الفشل المؤقت&lt;/li&gt;
&lt;li&gt;تأخير المحاولة التالية بالانسحاب الأسي&lt;/li&gt;
&lt;li&gt;إيقاف الاستدعاءات إلى التبعية عند الوصول إلى حد الفشل (الدائرة مفتوحة)&lt;/li&gt;
&lt;li&gt;الاستئناف بحذر بعد فترة تهدئة (استكشاف الدائرة)&lt;/li&gt;
&lt;li&gt;نقل العمل غير القابل للاسترداد إلى dead-letter أو مسار عزل&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="كيف-يبدو-الدعم-الأصلي"&gt;كيف يبدو الدعم الأصلي&lt;/h2&gt;
&lt;p&gt;يتكامل الدعم الجديد مع نموذج المضيف الحالي لـ Azure Functions — لا مكتبات إضافية، لا تطبيقات مخصصة. التكوين يذهب في ملف &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;يضبط تكوين قاطع الدائرة حد الفشل وفترة إعادة الضبط حتى لا يتم قصف التبعيات غير الصحية أثناء الاسترداد.&lt;/p&gt;
&lt;h2 id="اللغات-المشمولة"&gt;اللغات المشمولة&lt;/h2&gt;
&lt;p&gt;هذا ليس لـ .NET فقط. تشمل الميزة dotnet وJavaScript وTypeScript وPython — المجموعة الكاملة من اللغات المدعومة بمشغّل Service Bus في Azure Functions.&lt;/p&gt;
&lt;h2 id="الخلاصة"&gt;الخلاصة&lt;/h2&gt;
&lt;p&gt;لا تكون أنماط إعادة المحاولة مثيرة للتكوين حتى المرة الأولى التي يتسبب فيها انقطاع في المصب في أن تجعل Functions تفاقم المشكلة بدلاً من التدهور بشكل رشيق. إعدادها بصورة استباقية أمر رخيص. تكييفها أثناء حادثة ليس كذلك.&lt;/p&gt;
&lt;p&gt;المنشور الأصلي: &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>