تتطلب التطبيقات الويب الحديثة واجهات برمجية سريعة وموثوقة وقابلة للتوسع للتعامل مع معالجة البيانات في الوقت الفعلي. في هذا الدليل الشامل، سنتعرف على كيفية استغلال FastAPI وPydantic لبناء واجهات برمجية REST عالية الأداء يمكنها تقديم تطبيقات البيانات في الوقت الفعلي بكفاءة.
لماذا FastAPI وPydantic؟
ظهر FastAPI كأحد أقوى إطارات العمل في Python لبناء واجهات برمجية حديثة، حيث يجمع بين سرعة البرمجة غير المتزامنة وإنشاء وثائق واجهة برمجية تلقائيًا. ويوفر Pydantic، مكتبة الشركاء الخاصة به، قدرات قوية للتحقق من صحة البيانات وتحويلها، مما يجعل استجابات واجهة برمجية API موثوقة وقابلة للتنبؤ.
البنية الأساسية
لنبدأ بفحص البنية الأساسية لتطبيق FastAPI. يوضح المثال التالي هيكلًا أساسيًا لواجهة برمجية بيانات في الوقت الفعلي:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List
import asyncio
from datetime import datetime
app = FastAPI(title="Real-Time Data API", version="1.0.0")
class DataPoint(BaseModel):
id: int
value: float
timestamp: datetime
source: str
class DataResponse(BaseModel):
data: List[DataPoint]
metadata: dict
@app.get("/data", response_model=DataResponse)
async def get_real_time_data():
# محاكاة معالجة البيانات في الوقت الفعلي
data_points = [
DataPoint(
id=1,
value=42.5,
timestamp=datetime.now(),
source="sensor_001"
)
]
return DataResponse(
data=data_points,
metadata={"count": len(data_points), "processed_at": datetime.now()}
)تحسين الأداء
من أقوى ميزات FastAPI هي ميزات تحسين الأداء. إليك كيفية تنفيذ المعالجة غير المتزامنة للبيانات في الوقت الفعلي:
from fastapi import BackgroundTasks
import asyncio
from concurrent.futures import ThreadPoolExecutor
async def process_real_time_data(data: List[DataPoint]) -> List[DataPoint]:
"""محاكاة معالجة ثقيلة في الخلفية"""
# في السيناريوهات الحقيقية، قد تتضمن هذه عمليات قواعد بيانات،
# أو استنتاج التعلم الآلي، أو مكالمات واجهة برمجية خارجية
await asyncio.sleep(0.1) # محاكاة عمل غير متزامن
return [point for point in data if point.value > 0]
@app.post("/data/batch", response_model=DataResponse)
async def process_batch_data(
data: List[DataPoint],
background_tasks: BackgroundTasks
):
# معالجة البيانات بشكل غير متزامن
processed_data = await process_real_time_data(data)
# إضافة إلى مهمة خلفية للمعالجة المستمرة
background_tasks.add_task(process_background_tasks, processed_data)
return DataResponse(
data=processed_data,
metadata={"count": len(processed_data), "processed_at": datetime.now()}
)
async def process_background_tasks(data: List[DataPoint]):
"""التعامل مع مهام المعالجة الخلفية"""
# تحديثات قاعدة البيانات، الإشعارات، أو تأثيرات جانبية أخرى
passالتحقق من صحة Pydantic لسلامة البيانات
يضمن التحقق من صحة مخطط Pydantic أن بيانات الوقت الفعلي تبقى متسقة وآمنة. إليك مثال متقدم مع التحقق المخصص:
from pydantic import validator, root_validator
from typing import Optional
class AdvancedDataPoint(BaseModel):
id: int
value: float
timestamp: datetime
source: str
category: Optional[str] = None
@validator('value')
def value_must_be_positive(cls, v):
if v < 0:
raise ValueError('Value must be positive')
return v
@validator('source')
def source_must_be_valid(cls, v):
valid_sources = ['sensor_001', 'sensor_002', 'api_client']
if v not in valid_sources:
raise ValueError('Invalid source')
return v
@root_validator
def validate_category_based_on_source(cls, values):
source = values.get('source')
category = values.get('category')
if source == 'sensor_001' and category != 'temperature':
raise ValueError('Temperature sensors must have temperature category')
return values
class EventStream(BaseModel):
events: List[AdvancedDataPoint]
stream_id: str
last_updated: datetime
class Config:
json_encoders = {
datetime: lambda v: v.isoformat()
}التكامل مع WebSocket في الوقت الفعلي
لتطبيقات الوقت الفعلي الحقيقية، قم بدمج دعم WebSocket مع FastAPI:
from fastapi import WebSocket, WebSocketDisconnect
import json
class ConnectionManager:
def __init__(self):
self.active_connections: List[WebSocket] = []
async def connect(self, websocket: WebSocket):
await websocket.accept()
self.active_connections.append(websocket)
def disconnect(self, websocket: WebSocket):
self.active_connections.remove(websocket)
async def send_personal_message(self, message: str, websocket: WebSocket):
await websocket.send_text(message)
async def broadcast(self, message: str):
for connection in self.active_connections:
await connection.send_text(message)
manager = ConnectionManager()
@app.websocket("/ws/{client_id}")
async def websocket_endpoint(websocket: WebSocket, client_id: str):
await manager.connect(websocket)
try:
while True:
data = await websocket.receive_text()
# معالجة البيانات في الوقت الفعلي
response = {"message": f"Echo: {data}", "client": client_id}
await manager.send_personal_message(json.dumps(response), websocket)
except WebSocketDisconnect:
manager.disconnect(websocket)المراقبة والتحقق من الصحة
نفذ مراقبة شاملة لواجهة برمجية الوقت الفعلي الخاصة بك:
from fastapi.middleware.tracking import TrackingMiddleware
# إضافة وسطية التتبع
app.add_middleware(TrackingMiddleware)
@app.get("/health")
async def health_check():
return {
"status": "healthy",
"timestamp": datetime.now().isoformat(),
"services": {
"database": "connected",
"cache": "connected"
}
}
@app.get("/metrics")
async def get_metrics():
import psutil
return {
"cpu_percent": psutil.cpu_percent(),
"memory_percent": psutil.virtual_memory().percent,
"active_connections": len(manager.active_connections)
}الاعتبارات عند النشر في البيئة الإنتاجية
للاستخدام في البيئة الإنتاجية، فكر في استخدام Gunicorn مع مهام uvicorn:
# gunicorn_config.py
bind = "0.0.0.0:8000"
workers = 4
worker_class = "uvicorn.workers.UvicornWorker"
worker_connections = 1000
timeout = 30
keepalive = 2
max_requests = 1000
max_requests_jitter = 100
preload = Falseالخاتمة
يُعد بناء واجهات برمجية REST عالية الأداء لتطبيقات البيانات في الوقت الفعلي باستخدام FastAPI وPydantic مزيجًا قويًا من الميزات للتطوير. توفر الوثائق التلقائية لواجهة برمجية OpenAPI، والتحقق القوي من البيانات، والقدرات غير المتزامنة، هذه المجموعة مثالية للتطبيقات الحديثة. ومن خلال اتباع الأنماط الموضحة في هذا الدليل، ستتمكن من بناء واجهات برمجية لا تُضيع فقط في الأداء، بل تحافظ أيضًا على سلامة البيانات وتوفر تجربة ممتازة للمطورين من خلال وثائق شاملة لواجهة برمجية API.
سواء كنت تبني منصات بيانات الإنترنت من الأشياء، أو أنظمة التداول المالية، أو لوحة تحكم تحليلات الوقت الفعلي، فإن FastAPI وPydantic توفر الأساس اللازم لإنشاء واجهات برمجية قابلة للتوسع والصيانة، وعالية الأداء، قادرة على التعامل مع أحمال البيانات في الوقت الفعلي بكفاءة.