تصميم واجهات برمجة التطبيقات (API) للمؤسسات: REST مقابل GraphQL مقابل gRPC، الإصدار والامتثال لـ KVKK
سبعة قرارات عملية لتصميم API مؤسسي بدرجة إنتاج؛ اختيار البروتوكول (REST/GraphQL/gRPC)، عقد OpenAPI، استراتيجية الإصدار، تحديد المعدّل، سجلّ التدقيق، تدفّقُ البيانات الشخصية المتوافق مع KVKK. دروسٌ من مشاريع التكامل المؤسسي. ملاحظةٌ هندسية من eCloud Tech.
لم تَعد الـAPI مجرّد جسرٍ للبيانات بين التطبيقات؛ بل هي في معماريّة الشركات الحديثة العقدُ الحيّ للعمليات التجارية. بوّاباتُ العملاء، تطبيقاتُ الموبايل، تكاملاتُ B2B، شبكاتُ microservice، عملاءُ الذكاء الاصطناعي — كلٌّ يَتحدّث عبر الـAPI. وAPI سيّئةُ التصميم تُنتج مشروعَ ترحيلٍ خلال سنتين أو ثلاث؛ وAPI حسنةُ التصميم تَعيش 5-10 سنوات وتَتكيّف بسهولة مع حالات استخدامٍ جديدة. وتَتطلّب هندسةُ API المؤسسية قراراتٍ واعية في كل طبقة — من اختيار البروتوكول إلى انضباط الإصدار، ومن تحديد المعدّل إلى سجلّ التدقيق.
في إطار خدماتنا هندسة تكامل واجهات البرمجة وهندسة منصّات SaaS أنجزنا خلال الثلاثين شهرًا الماضية 19 مشروعَ تصميم/ترحيل API مؤسسية في قطاعات المالية والتجارة الإلكترونية والصحة واللوجستيات. وتعمل API منصّتنا AIGENCY v4 العامة والداخلية بنفس الانضباط. في هذا المقال نَعرض بالترتيب سبعَ قراراتٍ حرجة لتصميم API المؤسسي؛ اختيار البروتوكول، تصميم العقد، الإصدار، تحديد المعدّل، المصادقة، سجلّ التدقيق + تدفّق KVKK، والمراقبة + Observability.
1. اختيار البروتوكول؛ مصفوفةُ قرار REST وGraphQL وgRPC
شكل 1 — اختيار البروتوكول؛ مصفوفةُ قرار REST وGraphQL وgRPC
اختيارُ بروتوكول الـAPI هو قرارُ الهيكل العظمي — ترحيلُه صعب، يُحدّد المنظومة، يَصوغ مهاراتِ الفريق. ثلاثةُ خياراتٍ رئيسة (إضافةً إلى الـniches):
REST (Representational State Transfer) — API ذو توجّهٍ مَورِدي على دلالات HTTP. أوسعُ منظومة. مزايا؛ cache (HTTP cache، CDN)، تشخيصٌ سهل (curl، Postman)، توثيقٌ بمعيار OpenAPI 3.x، أدواتٌ غنيّة (Insomnia، Swagger UI، Stoplight). عيوب؛ over-fetching (يُرسل الخادمُ حقولًا لا يستخدمها العميل)، under-fetching (N+1 طلبًا لشاشةٍ واحدة)، إصدارٌ معقّد.
GraphQL — أصدرته Facebook في 2015، لغةُ استعلام schema-first. يَطلب العميلُ الحقولَ التي يحتاجها بدقّة، ويُعيد الخادمُ ذلك تمامًا. مزايا؛ تقليلُ البيانات (ميزةٌ لـ KVKK)، إنتاجيّةُ فِرَق العميل (عرضٌ جديد دون تغيير الـbackend)، استبطانٌ وأدوات (Apollo Studio، GraphiQL). عيوب؛ الـcache صعب (POST request، cache مستوى CDN لا يَعمل، يلزم Apollo Cache أو Persisted Queries)، مشكلةُ N+1 query (مع resolvers ساذجة)، مراقبةٌ معقّدة (لكل query شكلٌ مختلف)، تحديدُ المعدّل غير بديهي (depth limit وcomplexity limit طبقاتٌ منفصلة).
gRPC — Google 2016، HTTP/2 + Protocol Buffers (Protobuf) للتسلسل الثنائي. مُحسَّنٌ لخدمةٍ إلى خدمة. مزايا؛ طاقةٌ عالية وزمن انتظارٍ منخفض (ثنائي، multiplexing)، streaming ثنائي الاتجاه أصيل، typing قوي (Protobuf IDL)، polyglot (توليدُ كود لـ 40+ لغة). عيوب؛ ليس أصيلًا في المتصفّح (يلزم gRPC-Web proxy)، تشخيصٌ صعب (ثنائي)، نادرٌ في الـAPI العامة (مطوّرو الطرف الثالث ليسوا معتادين عليه).
مصفوفةُ القرار:
| السيناريو | الموصى به | السبب |
|---|---|---|
| API REST عامة (مطوّرو طرف ثالث) | REST + OpenAPI | منظومة، توثيق، OAuth، Postman |
| تطبيقُ موبايل — backend (خطرُ over-fetch عالٍ) | GraphQL | العميلُ يَسحب حقولَه، توفيرُ بيانات الموبايل |
| Web SPA — backend (CRUD بسيط) | REST | cache، تشخيص، منحنى تعلّمٍ منخفض |
| Microservice ↔ microservice (حجمٌ عالٍ) | gRPC | أداء، typing، streaming |
| المتصفّح → backend (ويب حديث) | REST أو tRPC | gRPC ليس أصيلًا |
| عميلُ ذكاءٍ اصطناعي — منظومةُ أدوات | REST + OpenAPI | منظومةُ LLM function calling مُهيَّأة لـ REST |
| Bank core ↔ تكاملُ قنوات | gRPC + mTLS | داخلي، أداء + أمان |
| تكاملُ B2B مؤسسي | REST + OpenAPI | معيارٌ مشترك، توليدُ SDK |
النمطُ الهجين؛ بوّابةُ REST عامة + gRPC داخلي. يَرى العميلُ REST، وشبكةُ microservice في الـbackend تَتحدّث بـ gRPC. في منصّة AIGENCY لدينا واجهةٌ عامة بـ REST مع مصادقةٍ مَعتمدة على token (توثيق: aigency.dev/docs)؛ ويَدعم هذا الخيارَ كونُ منظومة LLM/Agent function calling مُهيَّأةً لـ REST.
خطأٌ شائع؛ اختيارُ GraphQL لأنه trend. GraphQL هائلٌ في السيناريو المناسب، وتعقيدٌ غيرُ ضروري في السيناريو الخاطئ (CRUD بسيط + تطبيقٌ من صفحتين). والقرارُ يَتبع الملاءمة التقنية، لا الشهرة.
2. تصميم العقد؛ OpenAPI 3.x، Contract-first مقابل Code-first
شكل 2 — تصميم العقد؛ OpenAPI 3.x، Contract-first مقابل Code-first
عقدُ الـAPI هو المواصفةُ المهيكَلة التي تُعرّف URL لنقاط النهاية + HTTP method + شكلَ الطلب + شكلَ الاستجابة + status codes + متطلّبات المصادقة + صيغةَ الخطأ. وOpenAPI 3.x (المعروف سابقًا بـSwagger) هو معيارُ القطاع لـREST؛ وSDL (Schema Definition Language) إلزاميٌّ لـGraphQL؛ وملفّاتُ Protobuf .proto إلزاميةٌ لـgRPC.
Contract-first:
- يَكتب المصمّمُ OpenAPI YAML/JSON (
openapi.yaml). - مراجعةُ أصحاب المصلحة — Frontend وMobile ومطوّر طرف ثالث.
- mock server (Prism وMockoon وStoplight) يُتيح للـFrontend العمل بلا Backend.
- يُكتَب تنفيذُ الـBackend بمواجهة العقد.
- اختباراتٌ مُولَّدة (Schemathesis وDredd) تَلتقط contract drift في CI.
Code-first:
- يَكتب مطوّرُ الـBackend كودَ نقطة النهاية (Decorator + Type annotation).
- يَتولّد OpenAPI/SDL تلقائيًا من الإطار (FastAPI وNestJS وtRPC).
- يُولّد الـFrontend عميلًا حين يجهز الـBackend.
أيُّهما الصواب؟ من تجربتنا:
| السيناريو | المنهج | السبب |
|---|---|---|
| API عام/خارجي | Contract-first | مراجعةُ أصحاب المصلحة حرجة، العقد = commitment، انضباطُ التغيير الكاسر |
| تكاملُ شريك B2B | Contract-first | العقد = commitment قانوني، اتفاقٌ مسبقٌ مع الشريك |
| Microservice داخلي (فريقٌ واحد) | Code-first | تكرارٌ سريع، إطارٌ يُؤتمت |
| PoC سريع / hackathon | Code-first | كتابةُ العقد تُبطئ |
| فريقٌ متعدّد اللغات (TS + Python + Go) | Contract-first | مصدرُ حقيقةٍ واحد للـpolyglot |
| فريقٌ بلغةٍ واحدة (TypeScript فقط) | tRPC أو Code-first | typing من البداية للنهاية، التوليدُ غيرُ ضروري |
كي يُستخدَم وثيقةُ OpenAPI فعلًا، انضباط:
openapi-validatorفي خطّ CI — رفضُ pushes بـYAML غيرُ صالح.- في كل PR يكون diff لـ
openapi.yamlبندَ مراجعةٍ إلزامي (لإمساك التغييرات الكاسرة). - أداةُ
openapi-diffتُقارن schema القديم والجديد وتَقترح تلقائيًا semantic version bump. - قواعدُ Spectral lint (أسماءُ الحقول camelCase، استجابةُ الخطأ إلزامية، security scheme معرَّف، إلخ).
- SDKs مُولَّدة تلقائيًا (TypeScript وPython وGo) تُنشَر مع كل release إلى npm/PyPI/GitHub Releases.
- توثيقٌ علني عبر Swagger UI أو Redoc — تحت subdomain مثل
docs.your-api.com.
إطارُ حوكمة الذكاء الاصطناعي لدينا يُفصّل المحتوياتِ الإلزامية لعقد الـAPI من منظور التدقيق وKVKK (security schemes، علاماتُ pii_field، headers data_retention).
3. استراتيجيةُ الإصدار؛ URL وHeader وسياسةُ دورة الحياة
الإصدار هو العاملُ الحرج الوحيد لاستدامة API عام. الاستراتيجيةُ الخاطئة إمّا تُغضب العملاء (تغييراتٌ كاسرة دائمة) أو تُتلف الـbackend (الإصدارُ القديم لا يَموت أبدًا، يَتورّم الكود).
إصدارُ URL (/v1/users و/v2/users):
- مزايا؛ يَسهل تشخيصُه، يَعمل مباشرةً في Postman/curl، متوافقٌ مع الـcache (URL = مفتاح)، العميلُ يُضمّن الـURL.
- عيوب؛ نفسُ المورد في مكانَين، الترحيلُ يدوي.
- توصيتُنا؛ الافتراضي للـAPIs REST العامة.
إصدارُ Header (Accept: application/vnd.company.v2+json):
- مزايا؛ URL نظيفة، مناسبٌ لمتشدّدي REST.
- عيوب؛ تشخيصٌ صعب (header يدوي في curl)، يجب أن يَشمل مفتاحُ cache الـCDN الـheader (Vary header)، يَسهل خطأُ العميل.
- توصيتُنا؛ فقط للـAPIs الداخلية أو niches بإصدارٍ متناظر جدًا.
Query parameter (/users?version=2):
- مناسبٌ للنماذج السريعة، وفي الإنتاج تُداخل مفتاحُ الـcache مع التحليلات.
- لا نُوصي به.
سياسةُ دورة حياة الإصدار (تُلزَم كتابيًا):
| المرحلة | المدة | الإجراء |
|---|---|---|
| Active | غير محدّدة | ميزاتٌ جديدة وإصلاحُ bugs وتغييراتٌ كاسرة → MINOR bump |
| Deprecated | 12 شهرًا | headers Deprecation + Sunset، تحذيرٌ في التوثيق |
| إعلانُ sunset | قبل 3 أشهر | بريدٌ إلكتروني + banner في الـdashboard لكل العملاء |
| Sunset | في التاريخ | الـendpoint يُعيد HTTP 410 Gone |
قواعدُ التغيير الكاسر (MUST):
| التغيير | النوع | الإجراء |
|---|---|---|
| إضافةُ حقلٍ جديد (response) | غيرُ كاسر | MINOR bump |
| إضافةُ endpoint جديد | غيرُ كاسر | MINOR bump |
| تغييرُ نوع حقلٍ موجود | كاسر | MAJOR bump، مسارُ إصدارٍ جديد |
| إزالةُ حقلٍ موجود | كاسر | MAJOR bump |
| إضافةُ حقلٍ مطلوب (request) | كاسر | MAJOR bump |
| إضافةُ حقلٍ اختياري (request) | غيرُ كاسر | MINOR bump |
| تغييرُ كود خطأ | كاسر | MAJOR bump |
| تغييرُ المصادقة | كاسر | MAJOR bump + إعلانٌ منفصل |
تَصدر إصداراتُ MAJOR كل سنتَين + فقط في حالاتٍ متطرّفة. API تَصدر إصدارَ MAJOR جديد كل شهر غيرُ موثوقة — لا يَبقى العميلُ معها.
4. تحديدُ المعدّل والتقليص؛ استخدامٌ عادل + حمايةُ DDoS
تحديدُ المعدّل يَحمي المواطنين الصالحين ويُوقف الفاسدين. استراتيجيةٌ من ثلاث طبقات:
الطبقةُ 1 — عام / حمايةُ DDoS: على طبقة CDN/WAF (Cloudflare وAWS Shield وAkamai). عتبةٌ واسعة كـ10.000+ طلب/ثانية، مَعتمدةٌ على IP. الهدف؛ إيقافُ الهجمات الحجمية.
الطبقةُ 2 — لكل API key (استخدامٌ عادل): بحسب فئة العميل:
| الفئة | تحديدُ المعدّل | Burst | الحصّةُ الشهرية |
|---|---|---|---|
| Free | 60 طلب/دقيقة | 10 طلب | 100K طلب |
| Pro | 1.000 طلب/دقيقة | 50 طلب | 1M طلب |
| Enterprise | 10.000+ طلب/دقيقة | 200 طلب | بلا حدّ (مع SLA) |
Sliding window أنعم من Fixed window. عدّادٌ مَعتمدٌ على Redis:
INCR rate:user:{api_key}:{current_minute}
EXPIRE rate:user:{api_key}:{current_minute} 60
GET rate:user:{api_key}:{current_minute}
خوارزميةُ Token bucket تُوفّر سعةَ burst (متوسطٌ 100 طلب/دقيقة لكن burst لحظي بـ50 طلب).
الطبقةُ 3 — تحديدٌ لكل endpoint: حدودٌ منفصلة للنقاط المكلفة. مثال:
| الـEndpoint | الكلفة | الحدّ |
|---|---|---|
GET /users/{id} | منخفضة (قراءةُ DB) | الحدُّ العام |
POST /pdf/generate | عالية (تَوليد PDF 2 ث) | 10 طلب/دقيقة |
POST /ai/inference | عاليةٌ جدًا (LLM) | 5 طلب/دقيقة |
POST /export/csv | عالية (مسحُ DB) | 3 طلب/دقيقة |
استجابةُ HTTP إلزامية:
- عند تجاوز الحدّ؛
429 Too Many Requests - Headers:
X-RateLimit-Limit: 1000X-RateLimit-Remaining: 0X-RateLimit-Reset: 1716638400(epoch)Retry-After: 30(ثانية)
لوحةُ استخدامٍ للعميل إلزامية — يَرى المستخدمُ حصّتَه، تَحذيرٌ عند الاقتراب (بريدٌ إلكتروني / webhook)، تقريرٌ شهري.
منظورُ KVKK؛ طبقةٌ إضافية لحماية brute-force على نقطة POST /login — backoff أُسّي لكل محاولةٍ فاشلة (ثانية، ثانيتان، 4 ث، 8 ث…)، قفلٌ لمدة 15 دقيقة بعد 10 محاولات. تكاملٌ مع CAPTCHA وتحدّي MFA.
5. المصادقة والتفويض؛ OAuth 2.1 وJWT وmTLS
المصادقة = مَن أنت؟؛ التفويضُ = ماذا يحقُّ لك؟. أربعةُ أنماطٍ رئيسة في الـAPIs المؤسسية:
API key (بسيط):
- header
X-API-Key: ak_live_xxxxx. - خادمٌ إلى خادم، ليس قصيرَ العمر، دعمُ scope ضعيف.
- شائعٌ جدًا في الـAPIs العامة (Stripe وOpenAI)، وقد يكفي داخليًا.
- انضباطُ التدوير حرج — عند التسريب revoke فوريّ ومفتاحٌ جديد.
OAuth 2.1 + JWT (المعيارُ الحديث):
- خادمُ تفويض (Keycloak وAuth0 وOkta وCognito وAuthentik) مع الـflows.
- Authorisation Code Flow + PKCE (Mobile وSPA)، Client Credentials (خادم إلى خادم).
- Access token (قصيرُ العمر، 15 دقيقة – ساعة) + Refresh token (طويلُ العمر، 7-30 يومًا).
- يَحتوي JWT على
subوscopeوexpوclaims مخصّصة. لا تَستخدم HS256 المتناظر، بل RS256/ES256 اللاتناظري (تَسهل تدويرُ المفاتيح). - الخيارُ السائد للـAPIs العامة وB2B المؤسسية.
mTLS (mutual TLS):
- يُقدّم الطرفان (العميل + الخادم) شهادات.
- للـBank core ↔ القناة، تكامل أنظمة الصحة، البنية التحتية الحرجة.
- mTLS + OAuth معًا (دفاعٌ في العمق) في البيئات عالية الأمن.
RBAC + ABAC + Scope:
| النموذج | التعريف | المثال |
|---|---|---|
| RBAC (Role-Based) | مستخدم → دور → صلاحية | "admin"، "editor"، "viewer" |
| ABAC (Attribute-Based) | فحصُ سمات (قسم، منطقة، وقت) | "قسمُ التسويق + مكتبُ إسطنبول + 09-18" |
| Scope (OAuth) | scope صلاحيةٍ على الـtoken | users:read وorders:write |
| ReBAC (Relationship-Based) | رسمُ علاقات | "مؤلّفُ هذا المستند يَقدر يُعدّل" |
توصيةٌ عملية؛ scopes في JWT (خشنة) + RBAC على مستوى قاعدة البيانات (دقيقة). scopes عريضة كـread:users وwrite:users في الـJWT؛ وعلى مستوى قاعدة البيانات تفاصيلٌ كـ"هذا user_id يَرى صفوفَ مؤسستِه فقط".
تخزينُ الـtoken — localStorage في المتصفّح معرَّضٌ لـXSS؛ يُفضَّل cookies httpOnly Secure. للموبايل؛ Keychain (iOS) / Keystore (Android).
KVKK عمليًا؛ كلُّ endpoint API يَمسّ بياناتٍ شخصية يجب أن يَتطلّب scope — عميلٌ بلا scope read:user_profile لا يَصل إلى البيانات الشخصية، ويُرفَض الطلب (403 Forbidden).
6. سجلُّ التدقيق + تدفّقُ البيانات الشخصية المتوافق مع KVKK
الخطوةُ الأكثر تجاهلًا في الـAPI الإنتاجي هي سجلُّ التدقيق. وفي تحقيقات خرق KVKK وتدقيقات BDDK وامتثال SOC 2 يكون هو الدفاعَ الوحيد — توثيقُ مَن لمس أيَّ PII ومتى.
الحقولُ الأدنى لسجل التدقيق:
| الحقل | المثال | السبب |
|---|---|---|
| timestamp | 2026-05-25T14:32:17Z | الترتيبُ الزمني |
| request_id | uuid v4 | تتبّعٌ موزَّع |
| api_key_id | ak_live_xxxxx | مَن (تقنيًا) |
| user_id | u_98234 | مَن (تجاريًا) |
| client_ip | 203.0.113.42 | من أين |
| user_agent | Mozilla/5.0… | أيُّ أداة |
| http_method | GET | نوعُ الإجراء |
| endpoint | /v2/users/{id} | المورد |
| query_params | ?fields=name,email | التفصيل |
| response_status | 200 | النتيجة |
| response_time_ms | 142 | الأداء |
| pii_fields_accessed | [name, email, phone] | حرجٌ لـKVKK |
| auth_scope | read:users | الصلاحية |
تخزينُ السجلّ: غيرُ قابلٍ للتعديل، append-only — Elasticsearch + ILM (Index Lifecycle Management): 90 يومًا hot + سنتان warm + 5 سنوات cold (لامتثال احتفاظ KVKK). السحاب؛ AWS CloudWatch Logs + S3 Glacier، Azure Log Analytics + Blob archive. الوصولُ مقصورٌ على فريق الامتثال (RBAC + MFA).
نمطُ الإخفاء على مستوى الحقل (على طبقة API gateway):
الاستجابةُ الأصلية:
{
"user_id": "u_98234",
"name": "Mehmet Yılmaz",
"tc_kimlik": "12345678901",
"iban": "TR33 0006 1005 1978 6457 8413 26",
"phone": "+90 532 123 45 67"
}
دورُ خدمة العملاء:
{
"user_id": "u_98234",
"name": "Mehmet Yılmaz",
"tc_kimlik": "***********",
"iban": "TR33 **** **** **** **** **** 26",
"phone": "+90 532 *** ** **"
}
دورُ المالية:
{
"user_id": "u_98234",
"name": "Mehmet Yılmaz",
"tc_kimlik": "12345678901",
"iban": "TR33 0006 1005 1978 6457 8413 26",
"phone": "+90 532 *** ** **"
}
Sparse fieldset (?fields=… في REST، أصيلٌ في GraphQL) — يَسحب العميلُ الحقولَ التي يحتاج فقط، فلا تَعبر PII غيرُ ضرورية. التعبيرُ التقني عن مبدأ تقليل البيانات في KVKK.
الحقُّ في المحو (المادة 11 من KVKK) — عند وصول طلب محو:
- التحقّقُ من الهوية (هل الشخصُ هو فعلًا هذا المستخدم؟).
- endpoint الـAPI؛
DELETE /users/{id}أو أداةُ admin داخلية. - حذفٌ صلب (لا soft delete — ليس مجرّد عمود deleted_at، حذفٌ فعلي).
- حذفٌ متتالٍ (الطلباتُ المرتبطة، الجلسات، حقولُ PII في سجلّات التدقيق).
- ملاحظةٌ في سجلّ التدقيق عن حدث الحذف (مَن حذف ومتى — لا هويّةُ المحذوف، فقط الحدث).
- يجب أن يَكتمل خلال 30 يومًا.
النقلُ العابر للحدود: يُسجَّل بلدُ عميل الـAPI؛ ولنقل PII خارج الاتحاد الأوروبي تُضاف Standard Contractual Clauses إلى العقد + ترجمةٌ تركية.
7. المراقبةُ + Observability؛ ليس فقط يَعمل، بل صحيح
API إنتاجي يجب أن يكون أكثر من يَعمل؛ يجب أن يكون صحيًا. وهذا يَتطلّب ثلاثَ طبقاتٍ من الـobservability:
Metrics (مؤشّراتٌ عددية):
| المؤشّر | الهدف | المعنى |
|---|---|---|
| Request rate | متابعةُ الاتجاهات | الحجم |
| Error rate (4xx + 5xx) | <1% 5xx، <5% 4xx | الصحة |
| Latency p50 | <100 مللي ثانية | المسارُ السريع |
| Latency p95 | <500 مللي ثانية | معظمُ المستخدمين |
| Latency p99 | <2 ث | الحالةُ الأسوأ |
| Throughput (طلب/ثانية) | تخطيطُ السعة | إشارةُ التوسّع |
| Active API keys | تَبنّي العملاء | مؤشّرٌ تجاري |
| Rate limit hit rate | <2% | هل الفئةُ مَوزونة جيّدًا؟ |
Prometheus + Grafana (مفتوحُ المصدر)، Datadog/New Relic (مُدارة)، AWS CloudWatch/Azure Monitor (cloud-native).
Tracing (موزَّع): إذا مرّ طلبٌ بخمس microservices فاتّبعه من البداية للنهاية عبر trace ID. OpenTelemetry معيار؛ Jaeger/Tempo/AWS X-Ray كـbackend. حرجٌ لاكتشاف عُنق الزجاجة في الـlatency (أيُّ خدمةٍ بطيئة؟).
Logging (مُهيكَل): صيغةُ JSON، مستوى log (DEBUG، INFO، WARN، ERROR)، سياق (request_id، user_id، trace_id). Elasticsearch + Kibana، Loki + Grafana، Splunk. سجلُّ التدقيق على pipeline منفصل (غيرُ قابلٍ للتعديل، امتثال).
SLO + Error Budget:
- SLO؛ 99.9% توفّر (43 دقيقة/شهر downtime مقبولة).
- 99.95% (22 دقيقة/شهر) — فئةُ المالية/الصحة.
- 99.99% (4 دقيقة/شهر) — فئةُ البنية التحتية الحرجة (يَتطلّب multi-region active-active).
- استنفادُ Error budget → تجميدُ ميزات، التركيزُ على عملِ الموثوقية.
Alerting (PagerDuty وOpsgenie وGrafana OnCall):
- P1؛ 5xx rate >5% (5 دقائق مستمرّة) → SMS + هاتف للـon-call.
- P2؛ latency p99 >5 ث (10 دقائق مستمرّة) → SMS للـon-call.
- P3؛ rate limit hit rate >10% مستمرّ → بريدٌ إلكتروني.
- P4؛ ملخّصٌ يومي → قناةُ Slack.
Status page (Statuspage.io وInstatus وself-hosted): شفافيةٌ مع المستخدم. حادث → تحديثٌ علني → حلّ.
البنيةُ التحتية لهندسة البيانات كثيرًا ما تكون حرجة لـpipeline metric + log الـAPI — Kafka وETL وtime-series database.
ملخّصٌ عملي؛ قائمةُ بداية
الترتيبُ الصحيح لأوّل API إنتاجي:
- اختيارُ البروتوكول؛ العام = REST، الموبايلُ ثقيل = GraphQL، شبكةُ microservice داخلية = gRPC. الهجين OK.
- تصميمُ العقد؛ Contract-first (عام/B2B)، Code-first (فريقٌ داخلي منفرد). تحقّقٌ من OpenAPI 3.x في CI.
- الإصدار؛ إصدارُ URL افتراضًا، 12 شهرَ deprecated، انضباطُ semantic version.
- المصادقة؛ OAuth 2.1 + JWT (RS256)، تفويضٌ مَعتمد على scope، mTLS للحساسية العالية.
- تحديدُ المعدّل؛ 3 طبقات (DDoS + لكل key + لكل endpoint)، Sliding window + Redis، headers الاستجابة إلزامية.
- سجلُّ التدقيق؛ timestamp + هوية + endpoint + حقولُ PII المقروءة. تخزينٌ غيرُ قابل للتعديل، احتفاظٌ 5+ سنوات.
- KVKK؛ scope + إخفاء + sparse fieldset + pipeline حذفٍ صلب. سجلّاتُ النقل العابر للحدود.
- توثيقُ OpenAPI؛ Contract-first، SDKs مُولَّدة تلقائيًا، Swagger UI علني.
- المراقبة؛ ثلاثُ طبقات (metrics + traces + logs)، SLO + Error budget، Alerting + Status page.
- تحسينٌ مستمر؛ ملاحظاتُ العميل، تحليلاتُ الخطأ، خارطةُ deprecation، مراجعةُ أمنٍ سنوية (pentest).
هذه القائمةُ هي الحدُّ الأدنى للانضباط. ثم تُضاف فوقها إضافاتٌ قطاعية (PSD2 OAuth flow، FHIR/HL7 للصحة، ISO 27001 مصفوفةُ تحكّمٍ بالوصول). وقيمةُ API المؤسسي ليست في عمله اليوم، بل في بقائه قابلًا للاستدامة والتوثيق والتدقيق بعد ثلاث سنوات.
أنجز فريقُنا في شانلي أورفا قرة كوبرو 19 مشروعَ API مؤسسي في قطاعات المالية والتجارة الإلكترونية والصحة واللوجستيات عبر هندسة تكامل واجهات البرمجة وهندسة منصّات SaaS، ويُشغّل معماريّةَ API منصّتنا AIGENCY v4 بنفس الانضباط. ولأجل تصميم API مؤسسي، أو ترحيل، أو تقييم نضج API قائم لديكم، يمكنكم التواصل عبر نموذج الاتصال؛ والمكالمةُ الأولى للتقييم مجانية.
eCloud Tech — فريقٌ مقرّه شانلي أورفا في تركيا، يعمل في البرمجيات المؤسسية والذكاء الاصطناعي والبلوكتشين والأمن السيبراني. Building Tomorrow.
الأسئلة الشائعة
يستند القرار إلى ثلاثة متغيّرات. (1) نوع العميل؛ إن كانت احتياجات بيانات الويب والموبايل مختلفة فـGraphQL (كل عميل يَسحب حقولَه فقط، بلا over-fetching)؛ وإن كفى عقدٌ واحد للجميع فـREST (منظوماتٌ ناضجة للـcache والتشخيص والتوثيق). أمّا للتواصل بين الخدمات داخليًا بزمن انتظارٍ منخفض وطاقةٍ عالية فـgRPC (HTTP/2 وProtobuf وstreaming أصيل). (2) منظومةُ المطوّرين؛ يَعرف كلُّ فريقٍ REST ولا يتطلّب تدريبًا. وGraphQL يَتطلّب منحنى تعلّمٍ من أسبوعين إلى أربعة مع Apollo/Relay، ويُفيد منه كبار المهندسين. وgRPC يَتطلّب من الفريق تَبنّي انضباط Protobuf + IDL — ملاءمةٌ طبيعية للفِرق الثقيلة في الـbackend. (3) الخارجي مقابل الداخلي؛ ينبغي للـAPIs المعروضة للزبائن الخارجيين أن تكون غالبًا REST + OpenAPI (دعمُ الأدوات الخارجية، Postman، منظومة OAuth)؛ ولشبكات الخدمات الدقيقة الداخلية يَسود gRPC. والنمطُ الهجين شائعٌ كذلك؛ REST عام + gRPC داخلي (بوّابةُ REST تَعمل proxy إلى الـbackend بـgRPC). لا تَنخدع بأسطورة GraphQL مفيدٌ لكل شيء؛ فللـCRUD البسيط يَبقى REST الخيارَ الصحيح.
ثلاثةُ أنماطٍ رئيسة. (1) إصدارُ URL (/v1/users و/v2/users)؛ الأكثرُ شيوعًا، يَسهل تشخيصُه، يَعمل مباشرةً في Postman/curl، ومتوافقٌ مع الـcache. عيب؛ يُضمّن العملاءُ الـURL بشكلٍ ثابت في الكود، فيكون الترحيلُ أصعب. توصيتُنا؛ الافتراضي للـAPIs العامة. (2) إصدارُ Header (Accept: application/vnd.company.v2+json)؛ خيارُ متشدّدي REST، تبقى الـURL نظيفة. عيب؛ تشخيصٌ أصعب (header يدوي في curl)، يجب أن يَشمل مفتاحُ cache الـCDN الـheader. (3) Query parameter (/users?version=2)؛ مناسبٌ للنماذج السريعة، وضعيفٌ في الإنتاج لأنه يُداخل مفتاح الـcache مع التحليلات. سياسةُ دورة حياة الإصدار حرجة؛ إصدارٌ جديد يُطلَق ← يَعمل القديمُ بالتوازي 12 شهرًا على الأقل في وضع deprecated ← إشعارٌ للعملاء قبل 3 أشهر ← سَنسَتٌ نهائي. قاعدةُ التغيير الكاسر؛ يمكن إضافةُ حقل (غيرُ كاسر)، ولا يمكن إزالةُ حقل أو تغييرُ نوع (كاسر → ترقيةُ MAJOR إلزامية). مع semantic versioning (MAJOR.MINOR.PATCH) في الـAPI؛ MAJOR = الـURL يَرتفع، MINOR = نقطةُ نهايةٍ جديدة في changelog الـOpenAPI، PATCH = تصحيحُ سلوك.
المعيارُ استراتيجيةٌ من ثلاث طبقات. (1) تحديدُ معدّلٍ عام (حمايةُ DDoS)؛ أرقامٌ كبيرة كـ10.000+ طلب/ثانية بالمتوسّط لكل IP — على طبقة CDN/WAF (Cloudflare/AWS Shield). (2) تحديدٌ لكل API key (استخدامٌ عادل)؛ بحسب فئة العميل — Free 60-100 طلب/دقيقة، Pro 1.000 طلب/دقيقة، Enterprise 10.000+ طلب/دقيقة. خوارزميةُ Sliding Window أنعم من Fixed Window. والعدّاداتُ المعتمدة على Redis (INCR + EXPIRE) هي الأكثر شيوعًا. (3) تحديدٌ لكل endpoint (حمايةُ الموارد)؛ حدودٌ منفصلة للنقاط المكلفة (مثلًا توليدُ PDF، استنتاجُ ذكاءٍ اصطناعي بـ10 طلب/دقيقة). الحالةُ HTTP 429 وheader Retry-After وheaders X-RateLimit-Remaining / X-RateLimit-Reset إلزامية. ينبغي وجودُ لوحة استخدام للعميل — تنبيهٌ عند الاقتراب من الحدّ، ومعرفةُ وقت الانتظار عند تجاوزه. منظورُ KVKK؛ طبقةُ تحديدِ معدّل إضافيةٌ على نقطة تسجيل الدخول لحماية brute-force (محاولةٌ فاشلة → backoff أُسّي).
يجب توثيقُ الـAPI الإنتاجي بـ OpenAPI 3.x — وهذا ليس اختياريًا. ثلاثُ قيمٍ عملية. (1) توليدُ SDK تلقائي للعميل؛ openapi-generator يُنتج عملاءَ TypeScript/Python/Java/Go/Swift تلقائيًا؛ وكتابةُ SDK يدويًا تَستغرق أسابيع وتُنتج bugs. (2) عملٌ متوازٍ بين Frontend وBackend؛ يُكتَب العقدُ أوّلًا، وmock server (Prism وMockoon) يَسمح للـFrontend بالعمل بلا Backend. في مشروع AIGENCY عندنا وفّر هذا النمطُ ثلاثةَ أسابيع. (3) اختباراتٌ وتحققٌ آلي؛ أدواتٌ مثل Schemathesis تُولّد 1.000+ اختبارَ fuzz من عقد OpenAPI وتَلتقط contract drift في CI. Code-first مقابل Contract-first نقاشٌ منفصل — فِرَقُ TypeScript تُفضّل Code-first (tRPC وZod)، والفِرَقُ المؤسسية المتعدّدة اللغات Contract-first (OpenAPI yaml أوّلًا، ثم توليدٌ لكل لغة). توصيتُنا؛ للـAPI العام/الخارجي Contract-first بصرامة؛ ولـmicroservice داخلي Code-first مقبول.
سبعُ انضباطات. (1) سجلّاتُ تدقيقٍ إلزامية؛ كلُّ طلبٍ يَحمل PII — مَن (API key + user ID)، ومتى، وأيُّ endpoint، وأيُّ حقولٍ قُرئت — في سجلٍّ غير قابل للتغيير. أدلّةٌ إلزامية في تحقيقات خرق KVKK. (2) إخفاءٌ على مستوى الحقل؛ إخفاءُ حقولٍ كرقم الهوية والهاتف والـIBAN في الـresponse بحسب الدور (XXXXX1234). يَجري على طبقة API gateway. (3) تقييدُ الغرض؛ تَمنح API keys أو scopes في OAuth وصولًا مقيّدًا بالغرض للبيانات الشخصية (مثلًا scope تسويق لا يَرى بيانات الصحة). (4) تقليلُ البيانات؛ لـGraphQL ميزةٌ هنا على REST — يَسحب العملاءُ الحقولَ التي يحتاجونها فقط، فلا تَعبر PII غيرُ ضرورية. في REST يُستخدَم نمطُ sparse fieldset (?fields=name,email). (5) تشفيرٌ في الـtransit؛ TLS 1.2+ إلزامي؛ وmTLS للحساسية العالية (المصارف والصحة). (6) مراقبةُ النقل العابر للحدود؛ يُسجَّل بلدُ عميل الـAPI؛ ولنقل PII خارج الاتحاد الأوروبي تُضاف Standard Contractual Clauses + ترجمة. (7) الحقُّ في المحو؛ عند وصول طلبٍ بمحوٍ بموجب المادة 11 من KVKK — endpoint DELETE عبر الـAPI؛ حذفٌ صلب (لا soft delete) مع ملاحظةٍ في سجلّ التدقيق بأن المحو حصل (لا هويةُ الشخص — فقط حدثُ المحو). يُقدّم إطارُ حوكمة الذكاء الاصطناعي لدينا هذه الانضباطات السبع توثيقًا.
مقالات ذات صلة
DevOps و CI/CD للمؤسسات: دليل GitHub Actions و GitLab و Monorepo وأنماط النشر
سبعة قرارات عملية لـ CI/CD المؤسسي بجودة إنتاج: معمارية خطّ الأنابيب (GitHub Actions مقابل GitLab CI مقابل Jenkins)، Monorepo مقابل Polyrepo، استراتيجيات النشر (Blue-Green و Canary و Rolling)، إدارة الأسرار والـ Artifacts، سجلات خطّ الأنابيب المتوافقة مع KVKK. دروس من مشاريع B2B التركية. ملاحظة هندسية من eCloud Tech.
هندسة البرمجياتكيف تُنتج مئاتِ الصفحات بـ Programmatic SEO: دليلٌ معماريٌّ عملي
المعماريّةُ لإنتاج مئاتٍ من الصفحات ذات قيمة SEO من قالبٍ واحد ومصدرِ بياناتٍ مُهيكَل. نَستعرض مصفوفتنا الخاصّة من ٣٢ مدينة × لغة كحالة دراسة. ملاحظةٌ هندسيّة من eCloud Tech.
الاستخبارات السيبرانيةرصد الويب المظلم واستخبارات التهديدات للمؤسسات: دليل عملي للتطبيق
سبعةُ قراراتٍ عملية لكشف التسريبات، حماية العلامة، رصد جمع بيانات الاعتماد، تتبّع مواقع تسريب الفدية، ومتابعة وسطاء الوصول الأوّلي (IAB). MISP، خلاصاتُ TAXII، معماريّةُ الوصول عبر Tor/I2P، معالجةٌ متوافقة مع KVKK. دروسٌ من مشاريع الاستخبارات السيبرانية المؤسسية. ملاحظةٌ هندسية من eCloud Tech.