تحديد معدل الطلبات في Swift: إدارة تواتر الطلبات في iOS/macOS

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

تحديد معدل الطلبات في Swift (iOS/macOS): دليل شامل

تحديد معدل الطلبات (Rate Limiting) هو آلية بالغة الأهمية لضمان استقرار عمل تطبيقات الهواتف المحمولة وأجهزة الكمبيوتر المكتبية. في نظام Swift البيئي (iOS/macOS)، تمنع الإدارة الصحيحة لتواتر استدعاءات API، أو إرسال البيانات، أو تنفيذ المهام الخلفية، التحميل الزائد على الخوادم، وتوفر حركة المرور، وتحمي من إساءة الاستخدام. في هذه المقالة، سنستعرض بالتفصيل المكتبات والأدوات اللازمة لتنفيذ تحديد معدل الطلبات في Swift، بما في ذلك الخوارزميات وأمثلة الكود وأفضل الممارسات.



لماذا يعتبر تحديد معدل الطلبات مهماً لنظامي iOS/macOS؟

غالباً ما تتفاعل تطبيقات أجهزة Apple مع الخوادم البعيدة: تحميل المحتوى، مزامنة البيانات، إرسال التحليلات. بدون قيود:

  • قد يقوم الخادم بحظر التطبيق لتجاوزه الحد المسموح (HTTP 429 Too Many Requests).
  • تستنزف بطارية الجهاز بسرعة بسبب استدعاءات الشبكة المتكررة.
  • تصبح واجهة المستخدم غير مستجيبة عند تدفق الطلبات بشكل انهياري.


الخوارزميات الأساسية لتحديد معدل الطلبات

في Swift، يتم تطبيق ثلاث خوارزميات كلاسيكية في الغالب:

  • Token Bucket (سلة الرموز) — تتراكم الرموز بمعدل ثابت، ويستهلك كل طلب رمزاً واحداً. مناسب للأحمال المنتظمة.
  • Leaky Bucket (الدلو المتسرب) — تتم معالجة الطلبات بمعدل ثابت، ويتم تجاهل الطلبات الزائدة أو وضعها في قائمة انتظار.
  • Sliding Window (النافذة المنزلقة) — حساب عدد الطلبات خلال آخر N ثانية/دقيقة. مرن ولكنه يتطلب ذاكرة أكبر.


المكتبات الشائعة لتحديد معدل الطلبات في Swift



1. Alamofire (الآليات المدمجة)

على الرغم من أن Alamofire هو عميل HTTP، إلا أنه يوفر أدوات لتقييد الطلبات من خلال RequestInterceptor. يمكنك إنشاء معترض خاص بك للتحقق من عدد الطلبات وإضافة تأخيرات.

import Alamofire

class RateLimiter: RequestInterceptor { private let queue = DispatchQueue(label: "rate.limiter") private var lastRequestTime: Date? private let minimumInterval: TimeInterval = 1.0 // ثانية واحدة بين الطلبات func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) { queue.sync { if let last = lastRequestTime, Date().timeIntervalSince(last) < minimumInterval { let delay = minimumInterval - Date().timeIntervalSince(last) Thread.sleep(forTimeInterval: delay) } lastRequestTime = Date() } completion(.success(urlRequest)) }}

let session = Session(interceptor: RateLimiter())


2. SwiftyBeaver (تسجيل مع تقييد)

لتقييد تواتر السجلات، استخدم SBPlatformDestination مع إعداد minLevel ومرشح مخصص. ولكن للحصول على تحديد كامل لمعدل الطلبات، من الأفضل دمجه مع مكتبة منفصلة.



3. RateLimit (مكتبة متخصصة)

المكتبة مفتوحة المصدر RateLimit (متاحة عبر Swift Package Manager) تنفذ خوارزمية Token Bucket. إنها خفيفة الوزن ومناسبة تماماً لنظامي iOS/macOS.

import RateLimit

let limiter = TokenBucket(capacity: 10, fillRate: 1) // 10 طلبات في الثانية

func makeRequest() { guard limiter.consume() else { print("تم تجاوز حد المعدل. تم حظر الطلب.") return } // تنفيذ طلب الشبكة print("تم إرسال الطلب.")}


4. NetworkThrottle (أداة متقدمة)

تتخصص مكتبة NetworkThrottle في محاكاة الشبكات البطيئة وتقييد سرعة الطلبات. مفيدة للاختبار وتصحيح الأخطاء.

import NetworkThrottle

let throttle = NetworkThrot

توصيات