অধ্যায় 1: গোতে Retry এর পরিচিতি
1.1 পুনরায় চেষ্টা পদ্ধতির প্রয়োজন বোঝা
অনেক গণনা পরিদমে, সঙ্গেতিক সিস্টেম বা নেটওয়ার্ক যোগাযোগ সামগ্রীর সাথে, ক্রিয়াকলাপ অসফল হতে পারে অতীত অশান্তির কারণে। এই ভুল সাধারণভাবে নেটওয়ার্ক অস্থিরতা, সেবার অস্থায়ী অনুপলব্ধি, বা সময়সীমিততা সম্পর্কিত সমস্যা হতে পারে। এখনো সবচেয়ে নিকটন ও সকলীভুত সিস্টেমে অপারেশনগুলির পুনরাবৃত্তি করার দরকার বোঝা উচিত। এই উপায় যথাযথতা এবং জাতীয়তা উন্নত করে।
পুনরস্থাপনা ব্যবস্থাগুলি কীভাবে কাজ করে, এটির পূর্বে কতবার এবং কতক্ষণ পুনরাবৃত্তি করা উচিত, সেই ধরণের চ্যালেঞ্জগুলি নিয়ে সিদ্ধান্ত গ্রহণ উচিত। এই খেতাব প্রধানত অপরাজিত রিজিলিয়েন্টি এবং ব্যাবস্থার বেশি ত্রুটি হ্রাসে কোরা থাকে।
1.2 go-retry
লাইব্রেরী সম্পর্কে বিস্তারিত জানা
Go ভাষায় go-retry
লাইব্রেরীটি বিভিন্ন ব্যাকইফ রণনিতি দিয়ে আপনার অ্যাপ্লিকেশনে পুনরাবৃত্তি ব্যবস্থা যুক্ত করার জন্য একটি সময়োচিত উপায় দেয়। প্রধান বৈশিষ্ট্যগুলি অনুবাদ করা হল:
- প্রসারশীলতা: গোর
http
প্যাকেজের মতো,go-retry
এক্সটেনসিবল হয়ে রয়েছে মাধ্যমগুলির সাথে। আপনি আপনার নিজের ব্যাকইফ কার্যকলাপ লিখতে বা প্রার্থনা করতে দেওয়া হতে পারেন। - নির্ভরশীলতা: লাইব্রেরিটি শুধুমাত্র গোর মান পটভূমি নির্ভরশীল এবং বাহ্যিক নির্ভরতা এড়িয়ে চলে, যাতে আপনার প্রকল্পটি ভারী থাকে না।
- সমকালীন: এটি একইসাথে ব্যবহারের জন্য নিরাপদ এবং গোরুটাইন সাথে কাজ করতে পারে এবং যেকোনও অতিরিক্ত ঝামেলা ছাড়াই।
- সংদেশ-সচক্ষু: লাইব্রেরিটি নেটিভ গো সংদেশ সমর্থন করে জনাতে এবং বাতিল করার জন্য, যুক্ত গোর সমৃদ্ধ মডেলে সিম্পূর্ণ ফিটি করার জন্য।
অধ্যায় 2: লাইব্রেরী আমদানি করা
আপনি go-retry
লাইব্রেরীটি ব্যবহার করার আগে, আপনার প্রকল্পে এটি আমদানি করা দরকার। এটি go get
ব্যবহার করে করা যেতে পারে যা আপনার মডিউলে নির্ভরতা যুক্ত করতে গো কমান্ড। কেবলমাত্র আপনার টার্মিনাল খুলুন এবং নিম্নলিখিত বাধ্যতা সম্পাদন করুন:
go get github.com/sethvargo/go-retry
এই কমান্ডটি go-retry
লাইব্রেরীটি পেতে এবং আপনার প্রকল্পের নির্ভরতা যোগ করবে। তারপর আপনি এটি আপনার কোডে ব্যবহার করতে পারেন যেমন অন্য কোনও গো প্যাকেজের মতো।
অধ্যায় 3: সাধারণ Retry লজিক প্রয়োগ করা
3.1 স্থিতিশীল ব্যাকইফ সহ সহজ Retry
সবচেয়ে সাধারণ পুনরাবৃত্তি লজিকে প্রতিটি পুনরাবৃত্তি প্রচেষ্টা মধ্যে মাঝে মাঝে স্থায়ীভাবে সময় অপেক্ষা করা। আপনি একটি স্থিতিশীল ব্যাকইফ দিয়ে go-retry
ব্যবহার করতে পারেন।
এখানে স্থিতিশীল ব্যাকইফ কিভাবে ব্যবহার করবেন, তা হল:
package main
import (
"context"
"time"
"github.com/sethvargo/go-retry"
)
func main() {
ctx := context.Background()
// একটি নতুন ধারাবাহিক স্থিতিশীল ব্যাকইফ তৈরি করুন
backoff := retry.NewConstant(1 * time.Second)
// আপনার পুনরাবৃত্তি লজিক সংলগ্ন হওয়া ফাংশনে পাস করার জন্য গো করুন
operation := func(ctx context.Context) error {
// আপনার কোড এখানে। পুনরাবৃত্তিতে আপনার প্রকল্প করুন retry.RetryableError (err) পুনরায় বা শেষ করুন। ইউক্ষারহুন:
// err := someOperation()
// if err != nil {
// return retry.RetryableError(err)
// }
// ফিরে নিন না
return nil
}
// চাইলে retry.Do ব্যবহার করুন
if err := retry.Do(ctx, backoff, operation); err != nil {
// ব্যাপারটি হ্যান্ডেল করুন
}
}
এই উদাহরণে, retry.Do
ফাংশনটি প্রতিটি 1 সেকেন্ডে পর্যায়ে পুনরায় প্রচেষ্টা করবে যত পরে না এটি সাফল্য অর্জন করে বা প্রসাংগ টাইম আউট হয়ে যায় না।
3.2 গুনজানুন ব্যাকইফ ব্যবহার করা
গুনজানুন ব্যাকইফ পুনরায় বর্ধিত করে স্থিতিশীল ব্যবধানসমূহ মধ্যে অপেক্ষা সময় বৃদ্ধি দেয়। এই রণনি যখন বড় স্কেল সিস্টেম বা মেঘসারিতে সাথে কাজ করা হয়।
go-retry
এক্সপোনেন্টিয়াল ব্যাকইফ ব্যবহার করার সম্পর্কে কিভাবে বুঝানো হয়:
package main
import (
"context"
"time"
"github.com/sethvargo/go-retry"
)
func main() {
ctx := context.Background()
// একটি নতুন এক্সপোনেনশিয়াল ব্যাকইফ তৈরি করুন
backoff := retry.NewExponential(1 * time.Second)
// আপনার পুনরাবৃত্তি অনুমোদিত করা
operation := func(ctx context.Context) error {
// পূর্বে বস্তুত প্রয়োগ করুন
return nil
}
// পুনরাবৃত্তি দেওর জন্য retry.Do ব্যবহার করুন
if err := retry.Do(ctx, backoff, operation); err != nil {
// ব্যাপারটি হ্যান্ডেল করুন
}
}
এক্সপোনেনশিয়াল ব্যাকইফে যদি আদি ব্যাকইফ 1 সেকেন্ডে সেট করা হয়, পুনরাবৃত্তিটি পরবর্তী পুনরায় অনুপ্রস্থন পুনরায় পরবর্তী পুনরায় পরবর্তী স্থির সময়ের মধ্যে শিঘুর হয়।
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: উন্নত পুনঃচেষ্টা প্রযুক্তিগুলি এবং মিডলওয়্যার
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)
// 4 বার পুনঃচেষ্টা করার পর, যখন 5ম প্রয়াত্ন ব্যর্থ হয়েছে, প্রয়োজন
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)