𝗚𝗼 𝗖𝗼𝗻𝘁𝗲𝘅𝘁 𝗣𝗮𝗰𝗸𝗮𝗴𝗲
বেশিরভাগ Go ডেভেলপার context.Context এর সঠিক ধারণা ছাড়াই এটি ব্যবহার করেন। আপনি এটি HTTP handlers, database calls এবং SDK methods-এ দেখতে পাবেন। অনেক নতুন ডেভেলপার সব জায়গায় context.Background() পাস করে দেন।
এই ভুলটি সমস্যার সৃষ্টি করে। একটি Lambda function তার timeout সময়ের পরেও আটকে থাকতে পারে। একজন ব্যবহারকারী ডিসকানেক্ট হয়ে যাওয়ার পরেও একটি database query চলতে থাকতে পারে।
Context আপনাকে আপনার কোডের মাধ্যমে cancellation signals এবং deadlines পাঠাতে সাহায্য করে। এটি আপনাকে তিনটি প্রশ্নের উত্তর দিতে সাহায্য করে:
• এই অপারেশনটি কি চলতে থাকা উচিত? • এই অপারেশনটি কখন শেষ হতে হবে? • এই কলের সাথে কোন request data প্রবাহিত হচ্ছে?
Context interface-এ চারটি method রয়েছে:
Deadline(): Context কখন cancel হবে তা রিটার্ন করে।Done(): একটি channel রিটার্ন করে যা context cancel হলে বন্ধ হয়ে যায়। কাজ থামানোর জন্য select statements-এ এটি ব্যবহার করুন।Err(): Context কেন থেমেছে তা রিটার্ন করে (DeadlineExceeded অথবা Canceled)।Value(): Trace ID-এর মতো request-scoped data সংগ্রহ করে।
Context একটি tree হিসেবে কাজ করে। আপনি একটি parent context দিয়ে শুরু করেন এবং এর থেকে child context তৈরি করেন।
Root Contexts:
context.Background(): আপনার প্রোগ্রামের শুরুতে এটি ব্যবহার করুন।context.TODO(): Refactoring করার সময় এটি placeholder হিসেবে ব্যবহার করুন।
Child Contexts:
context.WithCancel(): এটি আপনাকে ম্যানুয়ালি কাজ থামানোর অনুমতি দেয়।context.WithTimeout(): একটি নির্দিষ্ট সময় পর কাজ থামিয়ে দেয়।context.WithDeadline(): একটি নির্দিষ্ট সময়ে কাজ থামিয়ে দেয়।context.WithValue(): User ID-এর মতো metadata পাস করে।
অত্যন্ত গুরুত্বপূর্ণ নিয়ম: সবসময় cancel function কল করুন। একটি child context তৈরি করার পরপরই defer cancel() ব্যবহার করুন। আপনি যদি এটি এড়িয়ে যান, তবে memory leaks তৈরি হতে পারে।
Best Practices:
- ফাংশনে প্রথম argument হিসেবে context পাস করুন।
- Struct-এর মধ্যে context সংরক্ষণ করবেন না।
context.WithValueশুধুমাত্র metadata-এর জন্য ব্যবহার করুন, database client-এর মতো dependencies-এর জন্য নয়।- দ্রুত এক্সিট করার জন্য দীর্ঘ লুপের ভেতরে
ctx.Err()চেক করুন। - Collision এড়াতে context keys-এর জন্য custom types ব্যবহার করুন।
যখন একটি parent context cancel হয়, তখন এর সমস্ত child context স্বয়ংক্রিয়ভাবে cancel হয়ে যায়। এটি আপনার পুরো সিস্টেম জুড়ে অপারেশনের একটি সম্পূর্ণ চেইন থামানো সহজ করে তোলে।