FastAPI / المتقدم: الحياة وتصميم خدمة موثوقة / الدرس 16
العملاء الخارجيون وميزانية التزامن
امتلك العميل والمهلة والفشل والعمل المحدود دون استنزاف بتفرع الطلبات.
في هذه الصفحة
أهداف الدرس
- اشرح افتراضات وحدود موضوع «العملاء الخارجيون وميزانية التزامن».
- فسر المثالين الكاملين وعلل المخرجات الملاحظة.
- شخص الإخفاقات وطبق الحلول المشروحة مع وضوح ملكية الهوية والحالة ودورة الحياة.
ينشئ الاستدعاء الخارجي حد فشل آخر
للبعيد زمن وهوية وحد وأثر مستقل، ولا يثبت نجاح النقل صحة البيانات. حدد الحالة والمخطط والمهلة وأمان المحاولة. يستخدم المثال MockTransport فلا يحل المضيف ويتحكم بالنجاح والمهلة ليفحص الترجمة والملكية لا زمن الشبكة وTLS والإتاحة.
from contextlib import asynccontextmanager
import httpx
from fastapi import FastAPI, HTTPException
from fastapi.testclient import TestClient
def upstream(request):
if request.url.path == "/fail":
raise httpx.ReadTimeout("synthetic timeout", request=request)
return httpx.Response(200, json={"id": 1})
@asynccontextmanager
async def lifespan(app):
async with httpx.AsyncClient(transport=httpx.MockTransport(upstream), base_url="https://upstream.example.invalid") as client:
app.state.upstream = client
yield
app = FastAPI(lifespan=lifespan)
@app.get("/proxy/{key}")
async def proxy(key: str):
try:
response = await app.state.upstream.get("/" + key)
except httpx.TimeoutException:
raise HTTPException(status_code=503, detail="Dependency timeout")
return response.json()
with TestClient(app) as client:
print(client.get("/proxy/item").json())
print(client.get("/proxy/fail").status_code)
{'id': 1}
503
يوفر النقل النجاح أوالمهلة داخليا وتترجم 503 وتغلق بالحياة.
إعادة العميل بملكية حياة صريحة
قد يمتلك العميل مجمعا عبر الطلبات ويغلق بالحياة، لا ينشأ لكل مساعد بلا سبب. اعزل اعتماد وترويسة الطلب حتى مع النقل المشترك. ينشئ المثال ويغلق الوهمي بنطاقه. لائم الحدود والانتظار ومهل الاتصال والقراءة، ولا تجعل رقما موعدا كليا لكل محاولة ومعالجة.
تصنيف الفشل وحفظ ملكية المستدعي
ترجم المهلة المعروفة دون أسرار واحفظ سبب غير المتوقع وسياقه. مرر الإلغاء كي لا يتراكم المهجور. قد ثبت أثر قبل المهلة؛ فتحتاج الإعادة منع تكرار أوتسوية. البديل عقد لقديم ومختصر مقبولين لا نجاح فارغ لكل استثناء.
تقييد النشط والمنتظر
تحد المحاكاة أربعة أعمال باثنين وتحفظ الترتيب كخاصية محلية. يحتاج الحقيقي حدود المدخل والطابور والبايت والزمن والاتصالات، ولا يحمي semaphore بعد ملايين المهام الذاكرة. لائم المجمع والحصة والزمن، ولا تخلط حد العملية وحد الاعتماد العالمي مع تعدد العمال.
import asyncio
async def main():
gate = asyncio.Semaphore(2)
state = {"active": 0, "peak": 0}
async def work(value):
async with gate:
state["active"] += 1
state["peak"] = max(state["peak"], state["active"])
try:
await asyncio.sleep(0)
return value * 2
finally:
state["active"] -= 1
values = await asyncio.gather(*(work(value) for value in [1, 2, 3, 4]))
print(values, state["peak"])
asyncio.run(main())
[2, 4, 6, 8] 2
تصل المحاكاة لاثنين وتحفظ الترتيب دون شبكة أومولد أوقاعدة أوقياس إنتاجية.
الاختبار ببدائل نقل وحدود دليل صريحة
اختبر النجاح والمشوه والمهلة والمحاولة والتنظيف ببديل مع بقاء المجال والحد. لا تنفذ الدورة شبكة أوخدمة أواعتمادا أوطابورا أوحملا، وليست المهام الأربع معيار سعة. افصل التكامل المصرح وأبلغ الدليل؛ فالموثوقية ملكية وحد ومجهول صحيح لا await وحدها.
الأخطاء الشائعة وإصلاحها
ينشئ كل طلب عملاء بلا حد
- لماذا يحدث؟
- غابت ملكية المجمع.
- كيف تصلحه؟
- استخدم عميلا مملوكا وأغلقه.
- كيف تتجنب تكراره؟
- اختبر الحياة وعزل المتغير.
تكرر المحاولة كتابة بعيدة
- لماذا يحدث؟
- عدت المهلة غياب أثر.
- كيف تصلحه؟
- استخدم الهوية وتسوية المجهول.
- كيف تتجنب تكراره؟
- حدد القابل قبل الأتمتة.
يعد semaphore محلي سقفا عالميا
- لماذا يحدث؟
- أُهمل تعدد العمال والنسخ.
- كيف تصلحه؟
- حدد إجمالي الطلب بالنشر.
- كيف تتجنب تكراره؟
- وثق الحدود مستقلة.
اختبر فهمك
1. يسمح خمسة عمال بعشرين لكل منهم. ماذا تراعي الميزانية؟
اعرض الحل المشروح
قد يصل النشط 100 قبل الآخرين والمحاولات؛ فاحسب النسخ والطوابير والانتظار والحدود لا المحلي وحده.
2. ماذا يثبت MockTransport عن TLS أومدة المهلة الحقيقية؟
اعرض الحل المشروح
لا يثبتها؛ بل استجابة للحدث المضبوط وحياة محلية. افصل تحقق الاتصال والشهادة والزمن بإذن.
أهم ما تعلمته
- للبعيد زمن وهوية وحد وأثر مستقل، ولا يثبت نجاح النقل صحة البيانات.
- ترجم المهلة المعروفة دون أسرار واحفظ سبب غير المتوقع وسياقه.
- اختبر النجاح والمشوه والمهلة والمحاولة والتنظيف ببديل مع بقاء المجال والحد.