هجرات قواعد البيانات بدون توقف عبر Alembic
كيف تنفذ تعديلات الجداول في PostgreSQL بدون حجز الأقفال وتوقف الخدمة: استراتيجية التوسع والانكماش (Expand and Contract)، إضافة الأعمدة الافتراضية، وبناء الفهارس باستخدام CONCURRENTLY.
أهلاً بك،
مطوّر بايثون وأنظمة — أكتب وأطوّر أدوات مفتوحة المصدر
أنا أحمد، بشتغل بالبايثون بقالي سنين، وأغلب شغلي باك إند: خدمات FastAPI، بوتات تيليجرام، وأدوات صغيرة مبنية على Redis.
أكتب عن أشياء طبّقتها بنفسي في مشاريع حقيقية: توحيد الكود، توضيح الأخطاء، التزامن، النشر على خوادم لينكس، والأدوات التي بنيتها وفتحت مصدرها. لا أكتب عن الذكاء الاصطناعي ولا محتوى مكرر؛ المكتوب هنا مبني على تجربة ونقاش صريح للعيوب.
كيف تنفذ تعديلات الجداول في PostgreSQL بدون حجز الأقفال وتوقف الخدمة: استراتيجية التوسع والانكماش (Expand and Contract)، إضافة الأعمدة الافتراضية، وبناء الفهارس باستخدام CONCURRENTLY.
كيف تحمي واجهات FastAPI من الهجمات الحقيقية: مبدأ الدفاع المتعمق (Defense in Depth)، تحديد المعدل متعدد الطبقات، منع تسريب البيانات عبر Pydantic، وتأمين رؤوس HTTP و CORS.
كيف تصمم معالجة المهام الخلفية لتعمل دون فقدان أي عملية: ضمان التسليم على الأقل مرة واحدة (at-least-once)، التعامل مع المهام المكررة بمبدأ Idempotency، وطوابير الرسائل الميتة (DLQ).
قالب FastAPI جاهز للإنتاج بفصل حاد بين الطبقات (api/core/services/repos)، وإعدادات مُنمطة عبر pydantic-settings، وريديس لثلاثة استخدامات منفصلة (كاش، تحديد معدل، قفل موزّع)، ولوجز JSON مع request-id، وبنية Docker متعددة المراحل وعامل CI يفحص lint و typing و tests. مبنيّ على مبدأ الاشتراك مع Redis بأوامر ذرّية (Lua) بدل الاعتماد على تنافس على مستوى العملية.
مكتبة Python غير متزامنة لتشغيل مهام موزعة فوق Redis، بدون أي خيط أو عملية وسيطة. التسليم يعتمد على LMOVE/BLMOVE الذرّية مع reaper يعيد جدولة المهام من العمال المتعطلين (at-least-once)، مع retries بـ backoff أُسّي، وطابور رسائل ميتة (DLQ)، وجدولة مؤجلة، وأولويات، وإلغاء المهام.
أداة تجهز سيرفر Debian جديد بطريقة قابلة للتكرار: مستخدم sudo، إعداد SSH آمن، جدار ناري UFW، fail2ban، تحديثات أمنية تلقائية، Docker من المستودع الرسمي، swap، وقت/NTP، وقوالب systemd. كل مرحلة بتفحص الحالة الأول ويبدل فقط اللي محتاج يتغير، مع dry-run كامل للاستعراض قبل أي تعديل وآلية تسجيل لكل تشغيل.