باب 1: گو میں دوبارہ کوشش کرنے کے اصول کا تعارف

1.1 دوبارہ کوشش کے ضرورت کو سمجھنا

بہت سی کمپیوٹنگ شعاریوں میں ، خاص طور پر جب تقسیم شدہ نظام یا نیٹ ورک ارتباط سے واسطے ہوتے ہیں ، عملیات ابتری کا سامنا کرتا ہے۔ یہ خرابیاں عام طور پر نیٹ ورک کی غیر استحکامی ، خدمت کی مختصر دورانیہ کی غیر دستیابی یا ٹائم آؤٹ جیسے ٹیمپورری خرابیوں کی وجہ سے واقع ہوتی ہیں۔ فوراً ناکام ہونے کی بجائے ، نظام کو عملیات کو دوبارہ کرنے کا اصول بنانا چاہئے جو ان طاری حادثات کا سامنا کرتے ہیں۔ یہ یکسانیت اور مضبوطی کو بڑھاتا ہے۔

دوبارہ کوشش کے اصولوں کی ضرورت ہے وہ جگہیں حیثیت اور عمل کی مکمل پوری کے معاملات میں جہاں عمل کرانے کی ضرورت ہے۔ یہ انتہائی حیثیت کا حامل ہوسکتے ہیں۔ البتہ ، ایک دوبارہ کوشش کا اصول بنانا چیلنج کے ساتھ آتا ہے ، جیسے کہ دیکھنا کہ کتنی بار اور کتنی دیر تک دوبارہ کوشش کی جائے پہلے ہار ماننے سے۔ یہاں بیک آف سٹریٹیجیز بڑی حد کھیلتی ہے۔

1.2 go-retry لائبریری کا جائزہ

گو میں go-retry لائبریری مختلف بیک آف اصولوں کے ساتھ اپلیکیشن میں دوبارہ کوشش کی منطقی انضمام کی ایک مستقل فراہم کرتی ہے۔ اہم خصوصیات میں شامل ہیں:

  • وسعت: گو کی http پیکیج کی طرح ، go-retry کو میڈیویئر کے ساتھ وسعت پذیر بنانے کے لئے ڈیزائن کیا گیا ہے۔ آپ خود بھی بیک آف فنکشن لکھ سکتے ہیں یا فراہم فلٹر کا استعمال کرسکتے ہیں۔
  • Azadi: یہ لائبریری صرف گو معیاری لائبریری پر مشتمل ہے اور بیرونی اتکائیوں سے بچتی ہے ، جس سے آپکا پروجیکٹ ہلکا رہتا ہے۔
  • متقارنہ: یہ متوازی استعمال کے لئے محفوظ ہے اور کسی اضافی پریشانی کے بغیر گوروٹینز کے ساتھ کام کرسکتی ہے۔
  • کنٹیکٹ-آویئر: یہ گو کا نیٹویٹو کنٹیکسٹ کا حمایت کرتی ہے جسے ٹائم آؤٹ اور منسوخ کیا جا سکتا ہے ، گو کے متوالے ماڈل کے ساتھ اتصال پذیر رہتی ہے۔

باب 2: لائبریریز کا درآمد

go-retry لائبریری استعمال کرنے سے پہلے ، آپکے پروجیکٹ میں اسے شامل کرنا ضروری ہے۔ یہ آپ go get کا استعمال کر کے کرسکتے ہیں جو آپکے ماڈیول میں اضافیات شامل کرنے کے لئے گو کمانڈ ہے۔ بس اپنی ٹرمینل کھولیں اور درج ذیل کو نافذ کریں:

go get github.com/sethvargo/go-retry

یہ کمانڈ go-retry لائبریری کو حاصل کرے گی اور اسے آپکے پروجیکٹ کی اضافیات میں شامل کرے گی۔ اس کے بعد ، آپ اسے اپنے کوڈ میں کسی بھی دوسری گو پیکیج کی طرح درآمد کرسکتے ہیں۔

باب 3: بنیادی دوبارہ کوشش کی منطق

3.1 مستقل بیک آف کے ساتھ سادہ دوبارہ کوشش

دوبارہ کوشش کی سب سادہ صورت میں ہر دوبارہ کوشش کے درمیان مستقل دورانیہ کے لئے انتظار کرنا شامل ہے۔ آپ go-retry کا استعمال کر کے مستقل بیک آف کے ساتھ دوبارہ کوشش کرسکتے ہیں۔

یہاں go-retry کے ساتھ مستقل بیک آف کا استعمال کرنے کا ایک مثال ہے:

پیکیج مین

میں (
  سرور
  وقت "
  "github.com/sethvargo/go-retry"
)

فنک میں ()
  کنٹیکس: = سرو
    
    // نیا مستقل بیک آف بنائیں
    بیک آف: = دوبارہ.نیا مستقل(1 * وقت.سیکنڈ)

    // آپ کی دوبارہ کوشش جو ہو گی وہ کسی فنکشن کے اندر ہوگی جو دوبارہ کوشش کے لئے دوبارہ کیا جائے گا
    عمل: = فنک (میں کنٹیکس کنٹیکس)
        // آپ کا کوڈ یہاں. دوبارہ کرنے یا کو نہ کرنے کے لیے
        // مثال:
        // err: = someOperation()
        // اگر err! = نل تو
        //   واپس رہنے والی خطا
        // یا نل کو منسوخ کریں
    }

    // مرغوب کنٹیکس ، بیک آف سٹریٹیجی اور عمل کے ساتھ دوبارہ کریں
    اگر error: = دوبارہ.کرنا(کنٹیکس ، بیک آف ، عمل)؛ قابو میں نہیں
        // خطا سے نمٹنا
    }
}

اس مثال میں ، retry.Do کا استعمال کرکے operation فنکشن ہر 1 سیکنڈ میں کوشش کرتا رہے گا جب تک کہ یہ کامیاب ہوجاتا ہے یا کنٹیکس ٹائم آؤٹ ہوجاتا ہے یا منسوخ ہوجاتا ہے۔

3.2 منفی بیک آف کا انضمام

منفی بیک آف خود بیس میں دوبارہ کوشش کے درمیان برداشت وقت کو مضافت کرتی ہے۔ یہ استریجی سسٹم پر بوجھ کم کرنے میں مددگار ہے اور خاص طور پر بڑے پیمانے پر نظامات یا کلاڈ خدمات کے ساتھ ہنگامی کرانے کے وقت کار آمد ہے۔

go-retry کے ساتھ منفی بیک آف کے استعمال کرنے کا طریقہ درج ذیل ہے:

پیکیج میں

میں (
  سرو
  وقت "
  "github.com/sethvargo/go-retry"
)

فنک میں ()
  کنٹیکس: = سرو

    // نیا منفی بیک آف بنائیں
    بیک آف: = دوبارہ.نیااتفاقی(1 * وقت.سیکنڈ)

    // دوبارہ کی عمل مکمل کریں
    عمل: = فنک (کنٹیکس کنٹیکس) وقت خروج
        // پچھلا داخلہ پورے طرہ سے پیشہ ورانہ ہوگا
    }
    
    // دوبارہ کی عمل عمل کے ساتھ منفی بیک آف کے ساتھ کرنے کے لئے کریں
    اگر error: = دوبارہ.کرنا(کنٹیکس ، بیک آف ، عمل)؛ قابو میں نہیں
        // خطا سے نمٹنا
    }
}

منفی بیک آف کی صورت میں ، اگر آغازی بیک آف کو 1 سیکنڈ مقرر کیا گیا ہو تو دوبارہ کوشش دوبارہ 1 سیکنڈ ، 2 سیکنڈ ، 4 سیکنڈ وغیرہ کے بعد ہوگی ، جو درمیانہ دورانیہ کو ہندسوں کی طرف بڑھاتا ہے۔

3.3 فائبوناچی واپسی استراتیجی

فائبوناچی واپسی استریجی میں فائبوناچی ترتیب استعمال کی جاتی ہے تاکہ دوبارہ کوشش کے درمیان انتظار کا وقت تعین کیا جا سکے، یہ ایک اچھا استریجی ہو سکتا ہے جب نیٹ ورک سے متعلق مسائل اٹھانے کے لئے ہو، یہاں دھیرے سے بڑھتے وقت آؤٹ کی فائدہ مند ہوتی ہے۔

go-retry کے ساتھ فائبوناچی واپسی کو منظر عام پر لانے کی نشاندہی نیچے دی گئی ہے:

package main

import (
  "context"
  "time"
  "github.com/sethvargo/go-retry"
)

func main() {
    ctx := context.Background()

    // فائبوناچی واپسی بنانا
    backoff := retry.NewFibonacci(1 * time.Second)

    // دوبارہ کوشش کے لئے عمل کا تعین
    operation := func(ctx context.Context) error {
        // یہاں وہ منطق ہوتا ہے جو کام کرنے پر ناکام ہوسکتا ہے اور دوبارہ کوشش کرنی ہو
        return nil
    }
    
    // فائبوناچی واپسی کے ساتھ کام کرنے کا عمل retry.Do کا استعمال کرکے
    if err := retry.Do(ctx, backoff, operation); err != nil {
        // خطا کا سامنا کریں
    }
}

فائبوناچی واپسی کے ساتھ ابتدائی قیمت کے ساتھ، دوبارہ کوششیں 1 سیکنڈ، 1 سیکنڈ، 2 سیکنڈ، 3 سیکنڈ، 5 سیکنڈ وغیرہ کے بعد ہوں گی۔

4.1: ریٹرائی تکنیک اور مڈیویئر میں اعلی دنیا

4.1: دوبارہ کوششوں میں جٹر کا استعمال

دوبارہ کوشش کے منصوبہ بنانے کے دوران، سسٹم پر دوبارہ کوششوں کے اثرات کو مد نظر رکھنا اہم ہے، جو سسٹم پر ایک ہنگامی مسئلے کا باعث بن سکتا ہے۔ اس مسئلے کو کم کرنے کے لئے ہم دوبارہ کوشش کے درمیان انٹروالوں میں خود بخودی عنصر شامل کر سکتے ہیں۔ یہ تکنیک دوبارہ کوشش کے کوششوں کو استوار کرتی ہے، مختلف گراہکوں کی مختلف وقت پر دوبارہ کوشش کرنے کی امکان کم کرتی ہے۔

جٹر شامل کرنے کا مثال:

b := retry.NewFibonacci(1 * time.Second)

// اگلی قیمت لوٹاؤ، +/- 500ms
b = retry.WithJitter(500 * time.Millisecond, b)

// اگلی قیمت لوٹاؤ، +/- 5٪ کے نتیجے میں
b = retry.WithJitterPercent(5, b)

4.2: زیادہ سے زیادہ دوبارہ کوششیں تعین کرنا

کچھ صورتوں میں،ناکامی کے پیچھے وقت برباد کرنے والی بے قاعدہ دوبارہ کوششوں کی تعداد محدود کرنا ضروری ہوتا ہے۔ ایسے حالات میں، ہم دوبارہ کوششوں کی زیادہ سے زیادہ حد کا تعین کرکے، عمل کے ساتھ مقابلت کرنے سے پہلے کی کوششوں کی تعداد کو کنٹرول کر سکتے ہیں۔

زیادہ سے زیادہ دوبارہ کوششیں کا تعین کرنے کا مثال:

b := retry.NewFibonacci(1 * time.Second)

// جب پانچویں کوشش ناکام ہوگئی ہو، چار دوبارہ کوششوں کے بعد رک جاؤ
b = retry.WithMaxRetries(4, b)

4.3: فردانی دوبارہ کوششوں کے وقت کو محدود کرنا

یہ یقینی بنانے کے لئے کہ فردانی وقت کو کسی مخصوص حد سے زیادہ نہ ہو، ہم CappedDuration مڈیویر کا استعمال کرسکتے ہیں۔ یہ یقینی بناتا ہے کہ خود بخودی دورانیں بہت زیادہ نہیں ہوں گی، اور دوبارہ کوشش کے عمل کو قابو میں رکھنا ہوتا ہے۔

فردانی دوبارہ کوششوں کے وقت کو محدود کرنے کا مثال:

b := retry.NewFibonacci(1 * time.Second)

// یقینی بناؤ کرے کہ زیادہ سے زیادہ قیمت 2 سیکنڈ ہو
b = retry.WithCappedDuration(2 * time.Second, b)

4.4: مکمل دوبارہ کوشش کے دوران کا وقت کنٹرول کرنا

صورتحال جب مکمل دوبارہ کوشش کے عمل کے لئے مکتمل عرصہ کی حد واضح کرنی ہو، WithMaxDuration مڈیویر کا استعمال کرتے ہوئے مکتمل کل اجراء کے عرصہ کو مخصوص کیا جا سکتا ہے۔ یہ یقینی بناتا ہے کہ دوبارہ کوشش کا عمل لامتناہی طور پر جاری نہ ہو، اور دوبارہ کوشش کے لئے وقت کا بجٹ بھی عائد کرتا ہے۔

مکمل دوبارہ کوشش کے دوران کا وقت کنٹرول کرنے کا مثال:

b := retry.NewFibonacci(1 * time.Second)

// یقینی بناؤ کرے کہ کل دوبارہ کوشش کا مکمل وقت 5 سیکنڈ ہو
b = retry.WithMaxDuration(5 * time.Second, b)