هندسة الفوضى لـ PHP: كيفية كسر التطبيق قبل أن يفعل ذلك المستخدمون

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

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

ابدأ الدورة

تطبيق PHP الخاص بك - فراشة هشة؟ حان الوقت لاختبار ذلك في الميدان

\n\n

تخيل: مساء الجمعة. لقد أصدرت للتو الإصدار الذي طال انتظاره. كل شيء يعمل بشكل مثالي. تصب الشاي، تفتح Telegram... وفجأة يتعطل قاعدة البيانات. أو Redis. أو API خارجي. هل هذا مألوف؟ إذا لم يكن كذلك - فغالبًا أنك لم تواجه الفوضى الحقيقية بعد.

\n\n

في عالم تطوير PHP، من المعتاد الاعتماد على "ربما". نكتب الكود، ونغطيه باختبارات الوحدة، وأحيانًا حتى اختبارات التكامل. ولكن ماذا يحدث عندما لا تسير الأمور وفقًا للخطة؟ عندما يفقد الخادم الحزم، أو تستجيب قاعدة البيانات بتأخير 10 ثوانٍ، أو يمتلئ نظام الملفات؟

\n\n

هنا يظهر هندسة الفوضى - وهو تخصص جاء من عالم Netflix والأنظمة الموزعة الكبيرة. لكن لا تتعجل في إغلاق المقالة: هذا يعمل أيضًا مع تطبيقات PHP العادية، حتى لو كان لديك تطبيق متكامل على Laravel أو Symfony.

\n\n

ما هي هندسة الفوضى ولماذا يحتاجها مطور PHP؟

\n\n

هندسة الفوضى هي ممارسة إجراء تجارب على النظام لتحديد نقاط الضعف قبل أن تظهر في عطل حقيقي. تقوم عمدًا بإدخال أعطال (إيقاف الخدمات، تأخير الاستجابات، قتل العمليات) وترى كيف يتصرف تطبيقك.

\n\n

يعتقد الكثيرون: "لدي تطبيق PHP بسيط، لماذا أحتاج هذا؟". لكن لنكن صادقين:

\n\n
    \n
  • هل يعتمد كودك على واجهات برمجة تطبيقات خارجية؟ نعم.
  • \n
  • هل لديك تخزين مؤقت عبر Redis أو Memcached؟ نعم.
  • \n
  • هل تستخدم قوائم الانتظار (RabbitMQ, Kafka, SQS)؟ على الأرجح، نعم.
  • \n
  • هل قاعدة البيانات MySQL/PostgreSQL؟ نعم.
  • \n
\n\n

كل نقطة من هذه النقاط هي نقطة فشل محتملة. ويتم اختبار تحمل الأخطاء في PHP للتطبيق فقط في اللحظة التي ينكسر فيها شيء ما. تسمح لك هندسة الفوضى بأن تكون الشخص الذي يكسر، وليس الشخص الذي يصلح.

\n\n

المبادئ الأساسية لهندسة الفوضى

\n\n

قبل كتابة الكود، تذكر ثلاث قواعد رئيسية:

\n\n
    \n
  • ابدأ صغيرًا. لا تقم بإيقاف تشغيل قاعدة البيانات بأكملها مرة واحدة. ابدأ باتصال واحد.
  • \n
  • امتلك فرضية. "إذا تعطل Redis، يجب أن يعمل التطبيق ولكن بشكل أبطأ" - هذه فرضية. اختبرها.
  • \n
  • أتمتة التراجع. امتلك دائمًا خطة للعودة إلى الحالة الطبيعية.
  • \n
\n\n

الآن ننتقل إلى أمثلة حقيقية بلغة PHP.

\n\n

مثال 1: محاكاة تأخير قاعدة البيانات

\n\n

لنفترض أن لديك استعلامًا نموذجيًا لـ MySQL. تستخدم PDO. كيف تتحقق مما سيحدث إذا بدأت قاعدة البيانات فجأة في "البطء"؟

\n\n

أسهل طريقة هي كتابة middleware أو غلاف لـ PDO يضيف تأخيرًا عشوائيًا. إليك مثال:

\n\n
<?php\nclass ChaoticPDO extends PDO {\n    private float $chaosProbability;\n    private int $maxDelayMs;\n\n    public function __construct(\n        string $dsn, \n        ?string $username = null, \n        ?string $password = null, \n        ?array $options = null,\n        float $chaosProbability = 0.1, // 10% من الاستعلامات ستكون "بطيئة"\n        int $maxDelayMs = 5000        // أقصى تأخير 5 ثوانٍ\n    ) {\n        parent::__construct($dsn, $username, $password, $options);\n        $this->chaosProbability = $chaosProbability;\n        $this->maxDelayMs = $maxDelayMs;\n    }\n\n    public function query(string $query, ?int $fetchMode = null, mixed ...$fetchModeArgs): PDOStatement|false\n    {\n        $this->maybeInjectDelay();\n        return parent::query($query, $fetchMode, ...$fetchModeArgs);\n    }\n\n    private function maybeInjectDelay(): void {\n        if (mt_rand() / mt_getrandmax() < $this->chaosProbability) {\n            $delay = mt_rand(100, $this->maxDelayMs);\n            usleep($delay * 1000);\n            // تسجيل للمراقبة\n            error_log("[CHAOS] تم إدخال تأخير قدره {$delay} مللي ثانية في استعلام قاعدة البيانات");\n        }\n    }\n}\n\n// الاستخدام\n$pdo = new Ch                

المدونات

توصيات الكتب