نمط Sidecar: توسيع الخدمات الصغيرة دون تعديل التعليمات البرمجية
في الأنظمة السحابية الأصلية الحديثة، من المتوقع أن تقوم الخدمات الصغيرة بأكثر من مجرد تشغيل منطق الأعمال. يجب عليهم التعامل مع التسجيل وإدارة شهادات SSL/TLS وجمع المقاييس وتنفيذ آليات إعادة المحاولة وتنسيق الاتصالات الآمنة مع الخدمات الأخرى.
إذا قمنا بتضمين كل هذه الوظائف الشاملة مباشرة داخل قاعدة التعليمات البرمجية لكل تطبيق، فسوف ينتهي بنا الأمر إلى تضخم التعليمات البرمجية، والاقتران المحكم، وقفل اللغة.
هذا هو المكان الذي يأتي فيه نمط Sidecar. في هذا الدليل، سنفصل ما هو نمط Sidecar، ولماذا هو ضروري لمعماريات الخدمات الصغيرة الحديثة، وكيف يعمل باستخدام تشبيهات بسيطة وأمثلة تكوين Kubernetes.
تشبيه العالم الحقيقي: السيارة الجانبية للدراجة النارية
أسهل طريقة لفهم هذا النمط هي التفكير في دراجة نارية بعربة جانبية.
تخيل أن لديك دراجة نارية عالية الأداء. لقد تم تصميمها للقيام بشيء واحد بشكل جيد للغاية: نقل راكب واحد بسرعة. الآن، لنفترض أنك بحاجة إلى حمل أمتعة الركاب أو إضافة مقعد إضافي.
يمكنك إعادة تصميم إطار الدراجة النارية ومحركها وعجلاتها بالكامل لتحويلها إلى سيارة. ومع ذلك، فإن ذلك يتطلب جهدًا هائلاً، ويفسد بساطة الدراجة، ويجعل صيانتها صعبة.
بدلاً من ذلك، يمكنك إرفاق عربة جانبية.
السيارة الجانبية عبارة عن وحدة منفصلة قائمة بذاتها تتصل بالدراجة النارية. فهي تشارك رحلة الدراجة النارية، وتذهب أينما ذهبت الدراجة، وتعمل جنبًا إلى جنب. ومع ذلك، فإن المحرك الأساسي للدراجة النارية لم يمس.
في هندسة البرمجيات:
- الدراجة النارية هي حاوية التطبيق الأساسية (التي تدير منطق عملك الأساسي، مثل الدفع أو مصادقة المستخدم).
- The Sidecar عبارة عن حاوية مساعدة منفصلة (تشغيل المهام المساعدة، مثل إنهاء SSL أو المراقبة أو شحن السجل).
- الرحلة هي دورة حياة النشر (على سبيل المثال، Kubernetes Pod).
المشكلة: المخاوف الشاملة وتضخم الكود
قبل السيارات الجانبية، كان على المطورين تضمين المكتبات المساعدة مباشرة في كود التطبيق الخاص بهم. على سبيل المثال، إذا أردت إرسال السجلات إلى خادم مركزي، فقد قمت باستيراد مكتبة تسجيل. إذا كنت بحاجة إلى مقاييس، فقد قمت بإضافة SDK للمقاييس.
خلق هذا النهج القائم على المكتبة العديد من التحديات الهامة:
- قفل اللغة: إذا كانت مكتبة المراقبة مكتوبة بلغة Go فقط، فلا يمكنك استخدامها بسهولة في خدمة Python أو Java الصغيرة. يجب عليك العثور على مكتبة أو إنشاءها لكل لغة في مجموعتك.
- التلوث البرمجي: يصبح منطق الأعمال مزدحمًا بالتعليمات البرمجية الخاصة بالبنية التحتية لإعادة المحاولة واكتشاف الخدمة والتشفير والتسجيل.
- الترقيات المعقدة: إذا تم العثور على ثغرة أمنية في مكتبة الاتصالات، فيجب على كل خدمة صغيرة تحديث تبعيتها وإعادة ترجمتها وإعادة نشرها.
- التنافس على الموارد: يتم تشغيل التعليمات البرمجية المساعدة في نفس عملية وقت التشغيل مثل التطبيق الرئيسي، مما يعني أن تسرب الذاكرة في المسجل يمكن أن يؤدي إلى تعطل التطبيق الأساسي بأكمله.
الحل: نمط السيارة الجانبية
يعمل نمط Sidecar على حل هذه المشكلات عن طريق نقل المهام المساعدة من عملية التطبيق الرئيسية ووضعها في عملية منفصلة ومستقلة تعمل بجوار التطبيق مباشرةً.
في البيئات الحاوية مثل Kubernetes، تعمل حاوية التطبيق والحاوية الجانبية داخل نفس Pod. لأنهم يشتركون في نفس الكبسولة:
- نفس مساحة اسم الشبكة: يشتركان في نفس عنوان IP ومنافذ الشبكة. يمكنهم التحدث مع بعضهم البعض على الفور عبر
localhostبدون زمن استجابة تقريبًا. - وحدات التخزين المشتركة: يمكنها الوصول إلى نفس مساحة تخزين القرص بالضبط، مما يسمح للجهاز الجانبي بقراءة ملفات السجل أو تحميل ملفات التكوين المكتوبة بواسطة التطبيق الرئيسي.
- دورة الحياة المتطابقة: يتم نشر الأداة الجانبية وبدء تشغيلها وإيقافها وتوسيع نطاقها جنبًا إلى جنب مع التطبيق الأساسي.
حالات الاستخدام الرئيسية لنمط السيارة الجانبية
Sidecars متعددة الاستخدامات بشكل لا يصدق. تتضمن بعض التطبيقات الأكثر شيوعًا ما يلي:
1. وكيل شبكة الخدمة (على سبيل المثال، Envoy، Linkerd)
بدلاً من قيام تطبيقك بإجراء مكالمات HTTP مباشرة إلى الخدمات الأخرى، فإنه يرسل طلبات إلى وكيل السيارة الجانبي المحلي الخاص به. يعالج الوكيل الجانبي التوجيه، وإعادة المحاولة، وموازنة التحميل، وقطع الدائرة، وتشفير TLS (mTLS) المتبادل، ثم يعيد توجيه الطلب. يظل التطبيق غير مدرك تمامًا لتعقيدات الشبكة هذه.
2. جمع السجلات وإعادة توجيهها (على سبيل المثال، البت السلس)
يقوم تطبيقك ببساطة بكتابة بيانات السجل الخاصة به إلى الإخراج القياسي أو ملف سجل محلي. تقوم الحاوية الجانبية بمراقبة هذا الملف، وتحليل السجلات، وإعادة توجيهها إلى محرك تحليل مركزي مثل Elasticsearch أو Datadog.
3. التكوين وإعادة التحميل السري
يمكن للعربة الجانبية مراقبة خادم بعيد (مثل Consul أو Vault) لتحديثات التكوين أو تدوير مفاتيح التشفير. عند اكتشاف تغيير، يقوم بتنزيل الملفات الجديدة إلى وحدة تخزين مشتركة ويشير إلى التطبيق الرئيسي لإعادة تحميلها، دون الحاجة إلى إعادة التشغيل.
مثال على تنفيذ Kubernetes
يعد إعداد السيارة الجانبية أمرًا سهلاً في Kubernetes. فيما يلي تكوين YAML بسيط يعرض سجلات كتابة حاوية تطبيق إلى وحدة تخزين مشتركة، وحاوية جانبية Fluent Bit تقرأ هذه السجلات وتشحنها:
apiVersion: v1
kind: Pod
metadata:
name: app-with-logging-sidecar
labels:
app: billing-service
spec:
containers:
# 1. Primary Application Container
- name: web-app
image: node:18-alpine
command: ["/bin/sh", "-c"]
args:
- >
while true; do
echo "$(date) [INFO] Transaction processed successfully" >> /var/log/app/output.log;
sleep 5;
done
volumeMounts:
- name: shared-logs
mountPath: /var/log/app
# 2. Sidecar Container (Log Shipper)
- name: log-shipper
image: fluent/fluent-bit:latest
volumeMounts:
- name: shared-logs
mountPath: /var/log/app
# In a real setup, Fluent Bit config would read /var/log/app/output.log
# and forward it to an external logging system.
# Shared disk storage accessible by both containers
volumes:
- name: shared-logs
emptyDir: {}
إيجابيات وسلبيات نمط السيارة الجانبية
مثل أي نمط تصميم، تأتي السيارات الجانبية بمقايضات:
| ميزة (برو) | العيب (كون) |
|---|---|
| محايدة للغة: تعمل العربة الجانبية في بيئتها الخاصة. يمكنك استخدام نفس المساعد الجانبي بجوار تطبيقات Go أو Java أو Python أو Ruby. | النفقات العامة للموارد: يؤدي تشغيل حاويات متعددة لكل حاوية إلى زيادة استهلاك وحدة المعالجة المركزية والذاكرة. |
| دورة الحياة المنفصلة: يمكن لفرق البنية التحتية تحديث تصحيحات أمان السيارة الجانبية دون لمس رمز التطبيق. | تعقيد متزايد: تؤدي إدارة ضعف عدد الحاويات إلى تعقيد تكوينات النشر وتصحيح الأخطاء والجدولة. |
| عزل الفشل المستقل: في حالة تعطل الحاوية الجانبية، يمكن لـ Kubernetes إعادة تشغيلها تلقائيًا دون إزالة التطبيق الرئيسي. | زمن استجابة بسيط للشبكة: يضيف توجيه حركة المرور من خلال الوكيل الجانبي المحلي قفزة صغيرة، على الرغم من أنها عادةً ما تكون ضئيلة (< 1ms). |
خاتمة
يُعد نموذج Sidecar لبنة أساسية في البنى السحابية الحديثة. ومن خلال عزل الاهتمامات الشاملة - مثل وكلاء الشبكة، والأمن، والتسجيل، وإدارة التكوين - في عملية مصاحبة منفصلة، فإنه يسمح للمطورين بالتركيز بشكل كامل على بناء قيمة الأعمال.
في حين أنه يقدم نفقات إضافية للموارد ويتطلب منصات تنسيق الحاويات مثل Kubernetes للإدارة بفعالية، فإن فوائد قواعد التعليمات البرمجية الأكثر نظافة ومرونة اللغة والقياس المستقل تجعله نمطًا لا غنى عنه للخدمات الصغيرة للمؤسسات.
استكشف المزيد من الرؤى المتعلقة بتطوير البرامج وهندسة الواجهة الخلفية على مدونة Gaznix →