نشر Canary على Go: نشر آمن دون خوف

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

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

ابدأ الدورة

نشر Canary مع Go: كيفية إصدار التحديثات دون خوف أو مخاطرة



تخيل: لقد أمضيت سنوات في بناء البنية التحتية، وكتابة الاختبارات، وإعداد المراقبة. والآن - الإصدار. نقرة واحدة، والنسخة الجديدة تنطلق إلى الإنتاج. القلب يدق، والأصابع ترتجف. هل هذا مألوف؟ وماذا لو أخبرتك أنه يمكنك نشر النسخة الجديدة على 5% فقط من المستخدمين، ومراقبة المقاييس، ثم نشرها للجميع فقط بعد ذلك؟ بدون توقف، بدون ذعر، مع سيطرة كاملة.



يسمى هذا نشر Canary. الاسم مشتق من عمال المناجم الذين كانوا يأخذون معهم طيور الكناري - كان الطائر يموت من الغاز قبل البشر، محذراً من الخطر. في عالم DevOps، يصبح أول 5-10% من المستخدمين هم "طيور الكناري" هذه، حيث يحصلون على النسخة الجديدة. إذا حدث خطأ ما - نتراجع دون ملاحظة المشاكل.



في هذه المقالة، سنشرح كيفية تنفيذ نشر Canary على Go مع أمثلة كود حقيقية، وموازن تحميل، ومقاييس. هيا بنا!



لماذا Go تحديداً لنشر Canary؟



Go هي لغة مصممة للخدمات المصغرة. يتم تجميعها في ملف ثنائي ثابت، ولا تتطلب تبعيات على الخادم، وقابلة للتوسع بسهولة. لكن الأهم - أن Go يحتوي على دعم مدمج للتزامن ومكتبات ممتازة لخوادم HTTP، مما يجعله مرشحاً مثالياً لتنفيذ توجيه ذكي للحركة المرورية.



  • الأداء - يعالج خادم Go آلاف الطلبات في الثانية على نواة واحدة.
  • سهولة النشر - ملف ثنائي واحد، لا حاجة لأجهزة افتراضية أو مفسرات.
  • نظام بيئي غني - حزم للمقاييس (Prometheus)، والتتبع (OpenTelemetry)، والموازنة.


إذا كنت تكتب بالفعل بلغة Go وتريد أتمتة النشر - فإن استراتيجية Canary ستصبح أفضل صديق لك.



بنية نشر Canary على Go



لنتخيل أن لدينا خدمة مصغرة بلغة Go تعالج طلبات المستخدمين. عادةً، ننشر النسخة الجديدة فوراً على جميع الحالات. مع نهج Canary، نقوم بتشغيل النسخة الجديدة بالتوازي مع القديمة، ولكننا نوجه إليها جزءاً فقط من الحركة المرورية.



إليك مخطط مبسط:



  1. النسخة المستقرة (v1) - تعمل على 90% من الحالات.
  2. نسخة Canary (v2) - تعمل على 10% من الحالات.
  3. موازن التحميل - يوزع الحركة المرورية بشكل متناسب.
  4. المراقبة - تقارن المقاييس (زمن الاستجابة، الأخطاء، الإنتاجية).
  5. اتخاذ القرار يدوياً أو تلقائياً - نشر v2 بنسبة 100% أو التراجع.


يمكن تنفيذ ذلك بطرق مختلفة: عبر Kubernetes (Service Mesh)، أو عبر Nginx بأوزان مخصصة، أو كتابة موازن خاص بنا بلغة Go. سنسلك الطريق الثالث - فهو يمنحنا سيطرة كاملة ومناسب تماماً للتعلم.



كتابة موازن حركة Canary بلغة Go



سنكتب وكيلاً عكسياً بسيطاً يقوم بتوجيه الطلبات إلى خلفيتين: stable و canary. سنحدد وزن نسخة Canary عبر ملف إعداد أو متغير بيئة.



package main

import ( "log" "math/rand" "net/http" "net/http/httputil" "net/url" "os" "strconv")

type CanaryProxy struct { stable *httputil.ReverseProxy canary *httputil.ReverseProxy canaryWeight int // نسبة الحركة المرورية إلى canary (0-100)}

func NewCanaryProxy(stableURL, canaryURL string, weight int) *CanaryProxy { stableTarget, _ := url.Parse(stableURL) canaryTarget, _ := url.Parse(canaryURL)

return &CanaryProxy{ stable: httputil.NewSingleHostReverseProxy(stableTarget), canary: httputil.NewSingleHostReverseProxy(canaryTarget), canaryWeight: weight, }}

func (p *CanaryProxy) ServeHTTP(w http.ResponseWriter, r *http.Request) { // اتخاذ القرار بناءً على رقم عشوائي if rand.Intn(100) <

المدونات

توصيات الكتب