ما الذي يقع أمام كل خدمة ويب
الترحيب
إذا أدخلت example.com في متصفح، لم تصل أبداً إلى جهاز يعمل التطبيق الفعلي. تصل إلى جهاز يقوم بتبديل الطلب إلى جهاز يعمل حقا. يقوم هذا الجهاز بتبديل الطلب ويحمل اسمًا: الوسطاء العكسي.
تتعلم هذه الدرس ما الذي يفعله العمود الفقري، لماذا تختفي معظم الخدمات العامة وراءه، وماذا يقوم العمود الحادي بتحميله في آن واحد.
في نهاية المطاف ستفهم:
- الفرق بين العميل، الوسطاء، والمصدر
- لماذا الوسيط أمام المصدر يحمي، ويزيد من القدرة التنافسية، ويزول دون أن يلاحظ أي شخص
- الوظائف الثلاثة التي يتعامل بها العمود الفقري في آن واحد: إخفاء المصدر، إنهاء TLS، وتوزيع الحمل بين الأصلاء
- كيف يتنقل الطلب من متصفح إلى وسيط إلى upstream وعودة، خطوة بخطوة
في نهاية المطاف ستفكر بثقة حول وضع الوسائط، فصل المعنيات في الحافة، ولماذا يضاعف العمود الفقري بسهولة بينما لا يزول مصدر واحد.
الوسيط الأمامي مقابل العمود الفقري العكسي
الاتجاهين للوسيط
كلا نوعي الوسيط يقف بين طرفين ويتعامل بالتركيب. يختلفان في الجانب الذي يمثلهما.
الوسيط الأمامي: يقف أمام مجموعة من العملاء. يعرف العملاء عن وسيط؛ لا يرى جهاز خارجي عنوان وسيط بل عنوان عميل. تتناسب مع هذا النمط الوسطاء الخرج، ومفاتيح المحتوى، ووسائط SOCKS.
الوسيط العكسي: يقف أمام مجموعة من الخوادم. يتحدث العالم الخارجي (العملاء) إلى عنوان وسيط; لا يعرف العملاء أن جهاز خادم مخفي يختبأ وراءه. تستخدم معظم الخدمات العامة على الإنترنت هذا النوع.
الذاكرة العصبية: الوسيط الأمامي يخفي العملاء من الخوادم. الوسيط العكسي يخفي الخوادم من العملاء.
لماذا يهم أن تعرف الاتجاه؟. تختلف المهمة، والأخطاء، والمحتوى الأمني. الوسيط الأمامي يقلق من من ي контакت. الوسيط العكسي يقلق من من ياتي إلى خوادمه.
العميل الذي يرسل تيارًا من خلال كلا النوعين في آن واحد: client -> forward_proxy -> الإنترنت -> reverse_proxy -> origin.
لماذا توجد الكثير في الركن
تجعل طبقة الرصيف تكسب العيش
يؤدي خادم التبديل ثلاث وظائف في نفس الوقت. أي منها تبرر الطبقة؛ لكن قيامها بجميع الوظائف الثلاثة في نفس العنوان يشرح لماذا يبدو معظم تصميمات الأرشitecture للمواقع الإلكترونية بنفس الشكل في الأمام.
الوظيفة 1: إخفاء الأصل. يرد الخادم التبديل على IP عامة. يوجد الخلفيات على IP خاصة التي لا يمكن الوصول إليها من الإنترنت. المهاجم الذي يريد ضرب الأصل يجب أولاً أن يفضح الخادم التبديل.
الوظيفة 2: إنهاء TLS. يملك الخادم التبديل شهادة التوقيع لـ example.com ويفك رموز الطلبات HTTPS المأخودة. يتبادل الخلفيات HTTP البسيط (أو TLS أسهل داخل) مع الخادم التبديل عبر قطاع محدد وموثوق. سياسة التبديل والتحديث والرموز المخفية توجد في مكان واحد.
الوظيفة 3: توزيع الحمل. يختار الخادم التبديل أي خادم يتعامل مع كل طلب. تكوّن الخلفيات وراء خادم التبديل مجموعة؛ يختار الخادم التبديل واحد لكل طلب باستخدام استراتيجية (دوار-دوار، أقل من الأصول، هاش على رأس). زيادة القدرة تعني إضافة خادم إلى المجموعة، وليس إخبار كل عميل بعنوان جديد.
كل وظيفة هي برنامج صغير. معاً يشرحان لماذا الطبقة مثل 'Caddy أمام تطبيق بايثون' تحمل وزن تصميم أكبر من تطبيق بايثون نفسه.
تصميم لجميع الثلاثة
يقوم فريقك بتشغيل API صغير على عملية بايثون واحدة تستمع على بورت 8000 على وحدة معالجة مركزية واحدة. ازدادت الطلبات إلى درجة أن وحدة معالجة مركزية واحدة لا تستطيع مواكبتها، وتميزت مراجعة الأمان بأن الوحدة لديها IP عامة وتصدر شهادة TLS الخاصة بها.
تقرر وضع خادم تبديل خلفي. رسم المخطط: إلى đâu يوجه DNS، أين شهادة التوقيع، كيف يصل الحمل إلى الخلفيات، وما يغير من الوحدة الأصلية؟
تبديل مكون بدون أن يلاحظ أي شخص
الاستعارة المزدوجة تكسب الحرية
يقول قديم في علم الحاسوب: يمكن حل كل مشكلة بإضافة طبقة من الاستعارة (إلا مشكلة وجود الكثير من طبقات الاستعارة). العكس المحلي هو واحدة من أكثر الاستعارات الفائدة في الأنظمة المتوزعة.
ما يكسب لك:
- خادمات الخلفية القابلة للتبديل. تحول تطبيقك من Python إلى Go؟ إعادة توزيع البيانات بين مراكز البيانات المختلفة؟ إطلاق إصدار جديد بدون وقف الخدمات؟ كل ذلك يحدث وراء عنوان عام مستقر. لا يحدث أي تغيير للاستخدمين.
- تكبير مستقل. الطبقة العلوية تتميز بتكبيرها على حسب الباندوايت والعمليات المتصلة في طبقة TLS. الطبقة الخلفية تتميز بتكبيرها على عمل التطبيق. كل منها ينمو على محور مختلف لأنها تعيش على أجهزة مختلفة.
- حصر المشاكل. نشر تعديل سيئ على الخادمات الخلفية لا يخنق عنوان العرض العام. العكس المحلي يبقى سليمًا؛ تُقدم صيغة التصحيح أو تُرد؛ العالم يُعاد الاتصال عندما تتعافى الخادمات الخلفية.
- المشاكل المتقاطعة في مكان واحد. توزيع السرعة، حظر الجغرافيا، تسجيل الطلبات، تحرير الرؤوس، تخزين التكيف،压缩 الردود: كل ذلك يعيش في العكس المحلي. تظل كود الخادمات الخلفية متمركزًا حول التطبيق.
بدون العكس المحلي يجب أن يعيش كل واحد من هذه المشاكل داخل عملية التطبيق. مع العكس المحلي يعيشون في طبقة واحدة التي يملكها فريق.
التكلفة: طبقة أخرى للعمل بها. يقبل الفرق المتطورة بتكلفة لأن الطبقة العلوية نفسها تعمل بلا حالة وتكبير أفقي؛ استبدال عكس محلي واحد باثنين لا يتطلب أي توافق.
استخدام العكس المحلي لتبديل الأزرق والأخضر
تشغيل فريقك إصدار 1 من واجهة التطبيق على ثلاثة أجهزة خادم خلفية (باحة أزرق) وراء عكس محلي. ترغب في نشر إصدار 2 مع القدرة على التراجع في ثواني ثلاثين إذا حدث شيء خاطئ.
تطلق ثلاثة أجهزة خادمات جديدة (باحة خضراء) تعمل بإصدار 2، بجانب الباحة الأزرق، ولكن لا تُوجه أي流量 إليهم بعد.
من المتصفح إلى الخادم الخلفي وعودة
اتبع طلب HTTPS واحد من البداية إلى النهاية
تبع طريقة واحدة لطلب HTTPS GET https://api.example.com/users/42 من خلال محفظة عكسية أمام مجموعة من الخوادم الخلفية.
الخطوة 1: حل DNS. يطلب المتصفح من محول DNS api.example.com. يعود المحول بمعرف IP عامة (على سبيل المثال، 203.0.113.10). يفتح المتصفح اتصالاً بالبروتوكول TCP إلى 203.0.113.10:443.
الخطوة 2: مفاوضات TLS. تقدم المحفظة شهادة اعتمادها لـ api.example.com. يفحص المتصفح شهادة الاعتماد، ويتفق الطرفان على مفاتيح جلسة، ويفتح القناة المشفرة.
الخطوة 3: طلب HTTP داخل TLS. يرسل المتصفح GET /users/42 HTTP/1.1\nHost: api.example.com\n.... تفتح المحفظة طلب البايتات المشفرة.
الخطوة 4: تحديد الخادم الخلفي. تتحقق المحفظة من مجموعة الخوادم الأمامية لـ api.example.com وختيار واحدة من الخوادم (على سبيل المثال 10.0.0.21:8000) باستخدام استراتيجيتها لتوزيع العرض.
الخطوة 5: طلب الخادم الأمامي. تفتح المحفظة (أو تستخدم مجددا) اتصالاً ببساطة HTTP إلى 10.0.0.21:8000 وترسل الطلب. قد تغير المحفظة رؤوس الطلب على طول الطريق: إضافة X-Forwarded-For: <client-ip>، تعيين Host: بشكل صحيح، إزالة رؤوس التبديل مثل Connection.
الخطوة 6: معالجة الخادم الخلفي. تقرأ تطبيق الخادم الخلفي الطلب، وتصفح قاعدة البيانات، وبناء رد JSON.
الخطوة 7: الرد الخلفي. يرسل الخادم الخلفي الرد إلى المحفظة كHTTP بسيط.
الخطوة 8: الرد بالحافة. قد تغير المحفظة أو تضغط على الرد، وتشفيره مرة أخرى من خلال جلسة TLS، وارسله إلى المتصفح.
الخطوة 9: دورة اتصال. تظل جلسة TLS مفتوحة للطلب التالي (يجمع HTTP/2 عدة طلبات على اتصال واحد). تجمع المحفظة عادةً الاتصالات نحو الخادم للreuse.
تبع كل خدمة ويب عامة هذا الشكل. يعرفك هذا الخطوات حول أين تجمع التأخير، وأين ينتمي التتبع، وأين يمكن أن يختبأ الخطأ.
أين ذهب الوقت؟
يشتكي مستخدم أن API يشعر بالبطء. تقوم بقياس وتجد أن الطلب يتخذ 850 مللي ثانية من نهاية إلى نهاية. تظهر سجلات الخادم في الخلفية أن التطبيق قام بالاستجابة للطلب في 40 مللي ثانية. تظهر سجلات البروكسي أن البروكسي استغرق 50 مللي ثانية من جهته من العمل (التوقيع TLS + التوجيه + كتابة الاستجابة).
صمم مشروع Edge البسيط لخدمة جديدة
التركيب
تعلمت الفرق بين مشروع forward و reverse، والثلاث وظائف التي يتعامل بها مشروع reverse في آن واحد، ولماذا يؤدي إخفاء المصدر أرباحًا في كل مرة تحتاج فيها إلى تغيير شيء ما، وكيف يتدفق الطلب عبر القفز من خلال الحافة.
أحضر ذلك الآن.
تخطط فريق صغير لإطلاق خدمة جديدة تسمى notes.example.com. سيستخدم المستخدمون قراءة وتحميل ملاحات شخصية. سيقوم الفريق بتشغيل اثنين من خادمات الوي إم في بدء التشغيل ويتوقع النمو إلى عشرة في السنة المقبلة. يريد HTTPS للمستخدمين وتسريح تدريجي للنسخ الجديدة وعدم الكشف عن IP الخادمات العامة.
أين يذهب هذا الدورة التالية
أين يذهب هذا الدورة التالية
أدت الدرس هذا الشكل من طبقة الحافة. ستدرس أربعة دروس إضافية في هذه الدورة تعتمد على ذلك:
- Stateless Horizontal Scaling: لماذا تُضاعف طبقة البروكسي (& الخلفيات الخلفية وراءها) بسهولة، ومعادلة الحجم لعدة مستنسخات تحت موجة.
- Separation of Ingress / Egress: لماذا تفشل كتلة بروكسي واحدة التي تتعامل مع الطلبات الواردة والخارجية في النهاية بطريقة مفاجئة، وكيفية تقسيم الطبقات.
- Modes of Failure & Blast Radius: كيف يتجاوز تغيير تكوين واحد إلى انقطاع الخدمة، وكيفية كتابة عناصر عمل بدون ذنب لتجنب التكرار.
- Observability & Capacity: ماذا يجب قياسه على الحافة حتى يعرف أن شيء broke قبل أن يفعل المستخدمون.
يتألف كل درس بشكل مستقل. عندما يتم تجميعها جميعًا، ستعطيك نموذجًا ذهنيًا يعمل على أسطوانة لمجموعة ويب مقاس كبيرة.
درس توأم: geometry_of_proxies_and_origins يكرر كل شيء في هذا الدرس كгра夫 مُوجه ويستكشف ما يقوله نظرية الخرائط عن مسار الطلب.
جيد جدًا. سيرحّل.