التعامل مع مهام الخلفية في Fastapi على عجل مرن
يمكن أن يكون نشر تطبيق Fastapi على AWS المرن من خلال التكلفة تجربة سلسة - حتى تواجه مشكلات مثل خطأ بوابة 502 سيئ. يتمثل أحد مطوري نقطة الألم الشائعة في التعامل مع مهام الخلفية طويلة الأجل ، والتي يمكن أن تؤدي إلى مهام البوابة. 🚀
تخيل هذا: لديك نقطة نهاية API التي تنشئ ملف PDF في الخلفية ، وتستغرق حوالي 30 ثانية. محليا ، كل شيء يعمل تماما. ولكن بمجرد نشرها على Onastic Beanstalk ، تفشل مكالمة API بخطأ محبط 502. لقد قمت بتعديل مهلة Nginx و Gunicorn ، لكن المشكلة تستمر.
هذا سيناريو كلاسيكي حيث تصطدم إعدادات البنية التحتية ومعالجة المهام الخلفية. قد تقوم AWS المرنة بالفاصولياء ، بشكل افتراضي ، بإنهاء الطلبات قبل اكتمال مهمة الخلفية. إن فهم سبب حدوث ذلك وكيفية العمل حوله هو مفتاح ضمان النشر السلس.
في هذه المقالة ، سوف نستكشف سبب تسبب مهام خلفية Fastapi 502 خطأ في Onstalstalk المرنة ، وكيفية تكوين الموعد بشكل صحيح ، وحلول بديلة للحفاظ على تشغيل واجهة برمجة التطبيقات الخاصة بك بسلاسة. سواء كنت تتعامل مع توليد PDF أو معالجة البيانات أو أي مهمة طويلة الأمد ، فإن هذه الأفكار ستساعدك على معالجة المشكلة بكفاءة. ⚡
يأمر | مثال على الاستخدام |
---|---|
background_tasks.add_task() | يضيف وظيفة إلى قائمة انتظار مهمة خلفية Fastapi ، مما يسمح للعمليات طويلة الأجل بالتنفيذ دون منع دورة الاستجابة الرئيسية للطلب. |
celery.task | يحدد مهمة خلفية الكرفس ، مما يتيح تنفيذ الوظائف غير المتزامنة مثل توليد PDF دون التدخل في أداء واجهة برمجة التطبيقات. |
sqs.send_message() | يرسل رسالة تحتوي على معرف الطلب إلى قائمة انتظار AWS SQS ، مما يضمن معالجة مهام الخلفية في نظام موزع. |
await new Promise(resolve =>await new Promise(resolve => setTimeout(resolve, 5000)); | ينفذ تأخير بين محاولات استطلاع API في JavaScript ، ومنع الطلبات المفرطة أثناء انتظار إكمال مهمة الخلفية. |
fetch_order(order_id) | يسترجع تفاصيل الطلب من قاعدة البيانات ، والتحقق مما إذا كان قد تم إنشاء PDF وتحديثه بنجاح. |
client.post("/generate-pdf/test_order") | ينفذ طلب اختبار HTTP في PYTEST للتحقق من صحة أن مهمة خلفية FASTAPI بدأت بشكل صحيح. |
time.sleep(30) | يحاكي عملية طويلة الأمد في مهمة الخلفية ، مما يضمن سلوك الوظيفة تحت العمليات المستهلكة للوقت. |
TestClient(app) | يقوم بإنشاء عميل اختبار لتطبيقات Fastapi ، مما يتيح الاختبار الآلي لنقاط نهاية API دون تشغيل الخادم الكامل. |
تحسين مهام خلفية fastapi على AWS مرنة الفاصوليا
عند تشغيل تطبيق fastapi على AWS مرنة الفاصوليا، التعامل مع مهام الخلفية طويلة الأجل بكفاءة أمر بالغ الأهمية لمنع 502 أخطاء بوابة سيئة. يستخدم البرنامج النصي الأول الذي قمنا بتطويره Fastapi's BackgroundTasks ميزة لمعالجة جيل PDF بشكل غير متزامن. يتيح هذا لاتصالات API إرجاع الاستجابة فورًا بينما تستمر المهمة في الخلفية. ومع ذلك ، يمكن أن يكون هذا النهج مشكلة في اتخار الفاصوليا المرنة بسبب كيفية تعامل Gunicorn و Nginx مع مهلة طلب.
لحل هذه المشكلة ، قدمنا حلًا أكثر قوة باستخدام الكرفس و Redis. في هذا الإعداد ، ترسل نقطة نهاية Fastapi مهمة إلى الكرفس بدلاً من التعامل معها مباشرة. يلتقط الكرفس ، الذي يعمل في عملية عامل منفصل ، المهمة وينفذها بشكل غير متزامن دون منع التطبيق الرئيسي. هذا يمنع مشكلات المهلة ، حيث يكمل طلب API على الفور بينما يتعامل الكرفس مع المعالجة بشكل مستقل. تخيل متجرًا على الإنترنت يولد الفواتير بكميات كبيرة - دون تفويض المهام المناسب ، سوف تكافح واجهة برمجة التطبيقات تحت الحمل. 🚀
بديل آخر قمنا باستكشافه هو الاستفادة من SQS AWS (خدمة قائمة انتظار بسيطة). بدلاً من الاعتماد على قائمة انتظار مهمة داخلية ، تدفع هذه الطريقة وظائف الخلفية إلى قائمة انتظار الرسائل المدارة. تعمل خدمة العمال الخارجية باستمرار على استطلاعات SQS للمهام الجديدة ومعالجتها بشكل غير متزامن. يعد هذا مفيدًا بشكل خاص في التطبيقات عالية الحركة ، مثل تطبيق مشاركة الركوب حيث تقوم كل رحلة بإنشاء مهام معالجة البيانات المتعددة. باستخدام AWS SQS ، نرفض تنفيذ المهمة من واجهة برمجة التطبيقات ، وتحسين قابلية التوسع والموثوقية.
أخيرًا ، على الجانب الأمامي ، قمنا بتنفيذ آلية اقتراع للتحقق من حالة المهمة. نظرًا لأن مهمة الخلفية تستغرق حوالي 30 ثانية ، يجب على الواجهة الأمامية الاستعلام بشكل دوري واجهة برمجة التطبيقات للتحقق مما إذا كانت PDF جاهزة. بدلاً من أن يكون الخادم الساحق بطلبات مستمرة ، قمنا بتنفيذ نهج يعتمد على الفاصل الزمني الذي يحفظ كل 5 ثوانٍ لعدد محدود من المحاولات. هذا يضمن أن الواجهة الأمامية تظل مستجيبة مع تجنب تحميل واجهة برمجة التطبيقات غير الضرورية. من خلال هذه الاستراتيجية ، لن يختبر المستخدمون توليد المستندات ، مثل التقارير الضريبية ، واجهة المستخدم التي لا تستجيب أثناء الانتظار. 📄✅
التعامل مع مهام خلفية Fastapi لتجنب 502 خطأ على AWS مرنة الفاصولياء
محلول الخلفية المحسّن باستخدام Fastapi و Celery
from fastapi import FastAPI, BackgroundTasks
from celery import Celery
import time
app = FastAPI()
celery = Celery("tasks", broker="redis://localhost:6379/0")
@celery.task
def generate_pdf_task(order_id: str):
print(f"Generating PDF for order {order_id}")
time.sleep(30) # Simulating long processing time
return f"PDF generated for order {order_id}"
@app.post("/generate-pdf/{order_id}")
async def generate_pdf(order_id: str, background_tasks: BackgroundTasks):
background_tasks.add_task(generate_pdf_task, order_id)
return {"message": "PDF generation started"}
النهج البديل: استخدام SQS AWS لمعالجة الخلفية
محلول الخلفية المحسّن باستخدام Fastapi و AWS SQS
import boto3
from fastapi import FastAPI
app = FastAPI()
sqs = boto3.client('sqs', region_name='us-east-1')
queue_url = "https://sqs.us-east-1.amazonaws.com/your-account-id/your-queue-name"
@app.post("/generate-pdf/{order_id}")
async def generate_pdf(order_id: str):
response = sqs.send_message(
QueueUrl=queue_url,
MessageBody=str(order_id)
)
return {"message": "PDF generation request sent", "message_id": response['MessageId']}
السيناريو الأمامي: استطلاع واجهة برمجة التطبيقات بكفاءة
حل الأمامي JavaScript الأمثل للاقتراع
async function checkPdfStatus(orderId) {
let attempts = 0;
const maxAttempts = 5;
while (attempts < maxAttempts) {
const response = await fetch(`/get-pdf-url/${orderId}`);
const data = await response.json();
if (data.pdf_url) {
console.log("PDF available at:", data.pdf_url);
return;
}
attempts++;
await new Promise(resolve => setTimeout(resolve, 5000));
}
console.log("PDF generation timed out.");
}
اختبار الوحدة لنقطة النهاية fastapi
اختبار وحدة Python باستخدام Pytest لـ Fastapi
from fastapi.testclient import TestClient
from main import app
client = TestClient(app)
def test_generate_pdf():
response = client.post("/generate-pdf/test_order")
assert response.status_code == 200
assert response.json() == {"message": "PDF generation started"}
تعزيز التعامل مع المهام الخلفية fastapi مع websockets
تحد واحد مع مهام الخلفية في fastapi يقدم تحديثات في الوقت الفعلي للمستخدمين دون الاعتماد على الاقتراع غير الفعال. بديل رائع هو استخدام WebSocketsوالتي تتيح الاتصال ثنائي الاتجاه بين العميل والخادم. بدلاً من الاستعلام بشكل متكرر نقطة النهاية للتحقق من حالة المهمة ، يمكن للواجهة الخلفية إرسال التحديثات كلما كان هناك تقدم.
باستخدام WebSockets ، عندما يطلب المستخدم توليد PDF ، يعترف الخادم على الفور بالطلب ويبدأ المعالجة في الخلفية. مع تقدم المهمة ، يمكن رسائل WebSocket إبلاغ العميل عن مراحل مختلفة ، مثل "المعالجة" و "التحميل" و "مكتمل". هذا يقلل من مكالمات API غير الضرورية ويحسن تجربة المستخدم ، وخاصة في تطبيقات مثل توليد فاتورة التجارة الإلكترونية أو تنزيلات التقارير. 🚀
يتطلب تطبيق WebSockets في Fastapi استخدام Asyncio و WebSockets الوحدة النمطية. يتم إنشاء اتصال WebSocket عندما يستمع الواجهة الأمامية للحصول على التحديثات ، ودفع الواجهة الخلفية رسائل في الوقت الفعلي. تعتبر هذه الطريقة فعالة للغاية مقارنةً بالاقتراع التقليدي وتستخدم على نطاق واسع في التطبيقات التي تتطلب تحديثات فورية ، مثل لوحات المعلومات المالية وأدوات التحرير التعاونية.
كثيرا ما يتم طرح الأسئلة حول مهام خلفية Fastapi
- لماذا تفشل مهمتي في خلفية Fastapi على AWS المرنة Beanstalk؟
- يحدث هذا غالبًا بسبب مهلة Nginx أو Gunicorn. جلسة --timeout في procfile وضبط nginx proxy_read_timeout يمكن أن تساعد.
- كيف يمكنني مراقبة مهام الخلفية طويلة الأمد في Fastapi؟
- يستخدم WebSockets للحصول على التحديثات في الوقت الفعلي أو تخزين تقدم المهمة في قاعدة بيانات وفضحها عبر نقطة نهاية API.
- ما هي أفضل طريقة لقائمة انتظار مهام الخلفية في Fastapi؟
- استخدام Celery مع Redis أو RabbitMQ يتيح قائمة انتظار مهمة قوية وقابلية للتوسع أفضل من مهام Fastapi المضمنة في الخلفية.
- هل يمكن استخدام AWS Lambda لمهام الخلفية في Fastapi؟
- نعم ، يمكنك إلغاء تحميل المهام طويلة الأمد AWS Lambda نشأ عبر SQS أو API Gateway لتحسين قابلية التوسع.
- كيف يمكنني منع مهام API لمهام Fastapi طويلة الأجل؟
- بدلاً من انتظار الاستجابة ، قم بإعداد المهمة بشكل غير متزامن background_tasks.add_task() واسترداد النتائج لاحقًا.
الأفكار النهائية حول التعامل مع مهام الخلفية في Fastapi
تعد إدارة المهام طويلة الأجل بكفاءة في Fastapi ضرورية لمنع مهلة الخادم وفشل واجهة برمجة التطبيقات. لا يتم تحسين الإعدادات الافتراضية الخاصة بـ VeanStalk للمعالجة الخلفية ، مما يجعل الحلول مثل Celery أو AWS SQS أو WebSockets حاسمة. من خلال تطبيق آليات قائمة الانتظار المناسبة والوقت الفعلي ، تظل واجهات برمجة التطبيقات أداءً وقابلة للتطوير ، حتى تحت الأحمال الثقيلة. ⚡
من إنشاء فواتير في منصة التجارة الإلكترونية إلى التعامل مع مهام معالجة البيانات الكبيرة ، يلعب تنفيذ الخلفية دورًا حيويًا في التطبيقات الحديثة. يجب على المطورين اختيار النهج الصحيح بعناية بناءً على احتياجات المشروع ، مما يضمن أن API يمكنهم التعامل مع الوظائف طويلة الأجل دون اضطرابات. يضمن الاستثمار في حلول إدارة المهام القابلة للتطوير تجربة أكثر سلاسة لكل من المستخدمين والمطورين.
موارد ومراجع إضافية
- وثائق Fastapi الرسمية في مهام الخلفية: مهام خلفية fastapi
- إعدادات مهلة الفاصوليا المرنة والتكوينات: تكوين AWS مرنة الفاصوليا
- استخدام الكرفس لمعالجة مهمة الخلفية في بيثون: وثائق الكرفس
- التعامل مع المهام طويلة الأجل بكفاءة في تطبيقات الويب: دليل Websockets MDN
- أفضل الممارسات لتحسين أداء واجهة برمجة التطبيقات: Google Cloud API أفضل الممارسات