هندسة الأنظمة الخلفية
نبني سجلات الأحداث وآلات الحالات وواجهات البرمجة التي لا تضيع سجلًا واحدًا ولا تفسيرًا واحدًا. كل حدث نلمسه يُسجَّل مرة واحدة بالضبط بُنيانًا، وعاطل للترديد بعقد، وقابل لإعادة التشغيل من أول بايت إلى آخره. حين يسأل مدقق «ماذا حدث لهذا السجل قبل ثلاثة أشهر»، يكون جوابنا من سجل تدقيق غير قابل للتعديل — لا من ذاكرة أحد.
إطلاقات يوميًا، تطوير جذعي
متوسط زمن الإصلاح لحوادث البيانات
صفوف سجل غير مسوّاة خلال 24 س
الحد الأدنى لتوافر واجهات المنصة
لماذا الأنظمة الخلفية
سلامة البيانات هي المكان الذي لا يُقبَل فيه «يعمل غالبًا»
خطأ الواجهة محرج؛ وخطأ الأنظمة الخلفية هو بيانات أحد. نهندس على هذا الأساس: كل تغيير حالة حدثٌ غير قابل للتعديل بُنيانًا، فلا يختلف السجل وإسقاطاته ولو تحت فشل جزئي؛ وكل نداء خارجي عاطل للترديد بعقد، فلا يُكتب سجل مرتين بإعادة الطلب؛ وكل انتقال حالة يعيش في محرك تدفق دائم، فلا يترك انهيار في منتصف التدفق سير عمل نصف ملتزم. نصمم بالأحداث قبل الجداول، لأن سجل التدقيق هو المواصفة والمخطط رؤية مشتقة منه. السجل ليس أثرًا جانبيًا للمنتج — بل هو المنتج نفسه.
لا نثق بأطر ORM في عمليات المجال، لأن التجريدات التي تخفي SQL تخفي أيضًا الخطأ بمقدار واحد الذي يكلّف عميلًا إيجاره. جوهرنا التعاملي مكتوب بلغة يجيب نظام أنواعها عن الكميات بوصفها أنواعًا أولية لا طافية؛ ومسار القراءة لدينا شأن منفصل، مُنسوخ ومفهرس لاستعلامات كانت ستثبّت ذاكرة الكتابة بخلاف ذلك. كل خدمة تُطلق باختبار عقد يثبت أن الواجهة تفعل ما تقوله مواصفة OpenAPI، وكل تغيير كاسر يمر عبر هجرات expand–contract فلا يرى الإنتاج إطلاقًا يكسر عميلًا في اللحظة نفسها التي يطلق فيها. حين يخطئ شيء — ويخطئ — يكون سجل التدقيق قابلًا لإعادة التشغيل، وتلتقط مهمة التسوية التباین خلال الساعة، وكتيب التشغيل هو الذي كتبه إنسان في الثالثة فجرًا الشهر الماضي.
ماذا نبني
الجوهر التعاملي لكل منصة فيدوشاواي يعيش هنا. هذا ما نملكه من النهاية إلى النهاية.
محركات السجلات والموافقات
حفظ مزدوج القيد مع ضمان متعدد الأطراف ومحرك سياسات يفرض قواعدك — كل إطلاق وموافقة ومراسم مفتاح على مسار تدقيق واحد.
سجلات غير قابلة للتعديل
إلحاق فقط، ومسلسل تشفيريًا، وقابل لإعادة التشغيل من التكوين إلى اليوم. السجل مصدر الحقيقة؛ وما عداه رؤية مشتقة تُعاد بناؤها عند الطلب.
مسارات التكامل
تكاملات عاطلة للترديد وقابلة للإعادة وواعية بالعكس مع أنظمة ERP وCRM والمستودعات وواجهات الشركاء — مُبنية لأنظمة تكذب وتتأخر وتضيع، ومتحقَّق منها ضدها.
مهمات التسوية
تسوية المصدر مقابل الناقل مقابل الهدف تجري كل ساعة؛ أي تباین ينادي مهندسًا لا خيط Slack. المهمة التي تلتقط السجل المفقود أهم من الميزة التي أطلقت مليونًا.
واجهات عقد أولًا
OpenAPI أولًا، وإصدار دلالي، واختبار عقد بـ Pact في كل طلب سحب. التغيير الكاسر الذي ينجو في الـ CI ينجو لأنه اتبع expand–contract لا لأننا توفقنا.
تدفقات دائمة
المعاملات طويلة الأمد وآلات الحالات تعيش في Temporal، فانهيار المعالجة في منتصف سير العمل يستأنف من آخر خطوة مكتملة — لا من البداية، ولا من حالة نصف أبدًا.
كيف نعمل
حلقتنا مدفوعة بالأحداث وعقد أولًا. هذه دورة واحدة من العاصفة إلى الكناري.
صمم بالأحداث
نُعصف بالأحداث على المجال قبل أن نمس قاعدة بيانات. سجل التدقيق هو المواصفة؛ والمخطط رؤية مشتقة منه.
اكتب العقد أولًا
مواصفة OpenAPI تصل قبل التطبيق؛ ويشاركها توقيع الواجهة الأمامية. تغيير المخطط بلا عقد موقّع بالاشتراك لا يُدمج.
نفّذ مقابل الاختبارات
اختبارات وحدة، وخصوصية، وعقد تجري عند كل التزام. التدفقات الحرجة تنال اختبارات خصوصية تطرق الثوابت عبر آلاف المدخلات العشوائية.
راجع ضد الترديد
كل معالج حدود خارجي يُراجع تحديدًا للترديد، ودلالات الإعادة، ومسارات الفعل التعويضي — أنماط الفشل التي تؤذي المال.
هاجِر expand–contract
تطلق تغييرات المخطط expand أولًا ثم contract لاحقًا — لا الاثنان دفعة واحدة. حذف عمود كاسر هو طلب سحب منفصل بعد أسابيع من توقف الكود الجديد عن قراءته.
أطلق خلف كناري
الإطلاقات تدرّجية: 1% ثم 10% ثم 100%، مع رجع آلي عند كسر SLO. الإطلاق الذي يفشل اختبار تدفق حرج يُرجَع قبل أن يقرأ إنسان التنبيه.
تعريف الجاهز
لا يُطلق تدفق حرج إلا حين يتحقق كل هذا
عاطل للترديد
كل معالج حدود خارجي له مفتاح تكرير واختبار خصوصية يثبت أن الإعادات آمنة.
مدقَّق
كل تغيير حالة يكتب إلى سجل إلحاق فقط، مسلسل تشفيريًا — قابل لإعادة التشغيل عند الطلب.
مُهاجَر بأمان
تغييرات المخطط تتبع expand–contract؛ ومسار الرجوع يُختبَر قبل أن يطلق مسار التقدم.
مُختبَر بالحمل
المسارات الحرجة تُختبَر بالحمل ببيانات واقعية وعند الذروة × 3؛ وزمن الاستجابة p99 يبقى داخل غلاف SLO.
عقد موثَّق
مواصفة OpenAPI محدّثة، واختبارات العقد خضراء، وكتيب المناوبة محدّث من المهندس الذي كتب الكود — لا من أحد يهندسه عكسيًا لاحقًا.
الأدوات ولماذا نستخدمها
مُملّة عن قصد. اختيرت كل أداة لنمط فشلها لا لعرضها الترويجي.
ACID، ونسخ متين، ونظام أنواع واصف يُبقي الكميات خارج الطافيات.
تنفيذ دائم لتدفقات الموافقات طويلة الأمد؛ انهيار في منتصف التدفق يستأنف من آخر خطوة مكتملة.
سجل أحداث إلحاق فقط يضاعف بوصفه عمود تدقيقنا وحافلة تكاملنا.
الجوهر التعاملي: نظام أنواع ونموذج تزامن يجعلان حالات الفشل الجزئي مرئية وقت الترجمة.
سطوح الخدمات والأدوات الداخلية؛ الوضع الصارم يُبقي شكل الواجهة صادقًا عبر الفريق.
تطوير عقد أولًا؛ المواصفة تطلق قبل الكود، واختبارات العقد تثبت أن الطرفين متفقان.
سجلات منظمة مربوطة بمعرّف المعاملة؛ أي حادث يُعاد تشغيله حدثًا بحدث من سجل التدقيق.
اختبارات حمل عند الذروة × 3 ببيانات واقعية؛ يبقى زمن الاستجابة p99 داخل غلاف SLO أو يفشل البناء.
كيف نتواصل
حيث تلتقي الأنظمة الخلفية ببقية الشركة
الواجهة الأمامية
نشارك توقيع عقود OpenAPI؛ المواصفة تطلق قبل الكود. التغيير الكاسر الذي لا تستطيع الواجهة استيعابه لا يُدمج.
DevOps
نمتلك SLO معًا؛ الأنظمة الخلفية تكتب الكتيب، وDevOps يملك الكناري وذراع الرجوع. لا أحدنا يطلق مسار حرج دون توقيع الآخر.
الجودة
اختبارات الخصوصية والعقد تُكتب بالاشتراك؛ والجودة تملك مصفوفة سيناريوهات المسارات الحرجة التي تجري ضد كل مرشح إصدار.
علوم البيانات
تصديرات البيانات أحداث من سجل التدقيق، لا ندقات مباشرة إلى القاعدة. لا تثبّت التحليلات ذاكرة الكتابة أبدًا؛ وتُبصر نماذج المخاطر نفس الأحداث التي ستبصرها الجهة الرقابية.
أسئلة تُطرح علينا
لماذا لا ORM للبيانات الحرجة؟
التجريدات التي تخفي SQL تخفي أيضًا الخطأ بمقدار واحد الذي يفسد سجل عميل. نستخدم منشئ استعلامات رفيعًا مع تحويل صريح للأنواع الأولية للمجال، وينظر مراجع الكود تحديدًا إلى إكراه الكميات إلى طافي.
كيف تعمل التسوية فعلًا؟
ثلاثية: النظام المصدر مقابل ناقل الأحداث مقابل استجابة الهدف، كل ساعة. أي تباین ينادي مهندس المناوبة مباشرة — ولا يصل أبدًا إلى طابور «سننظر غدًا».
كيف لا تكسر الهجرات الإنتاج؟
expand–contract فقط. تطلق الهجرة الأمامية أولًا وتجري لأسابيع بمساري الكود القديم والجديد معًا؛ وتطلق هجرة contract التي تزيل المسار القديم منفصلة بعد أن يثبت القياس أن لا شيء يقرؤه.
كيف المناوبة؟
أسبوع أساسي، ثم أسبوع ثانوي، ثم أربعة أسابيع إجازة. الكتيبات يكتبها المهندس الذي بنى النظام؛ والتنبيهات التي تطلق أكثر من مرتين تطلق تلقائيًا بندًا في تراكم إصلاح الكتيب. لا ننادي بشرًا على ما تستطيع مهمة التقاطه.
لماذا متآلف وحدوي لا خدمات مصغّرة؟
المتآلف الوحدوي مع خدمات تشفير مستخرجة يمنحنا حد تدقيق واضح، وإطلاقًا واحدًا نتأمله، واتساقًا تعامليًا حيث يقتضي المال — دون ضريبة تشغيل نظام موزّع لا نحتاجه.
مهمتنا
نبني السجلات والمسارات التي لا تضيع قرشًا ولا تفسيرًا. نتعامل مع سجل التدقيق بوصفه المواصفة والمخطط رؤية مشتقة منه، حتى يثق كل جهة رقابية وكل مشغّل وكل عميل بمصدر الحقيقة نفسه — قابل لإعادة التشغيل عند الطلب.