𝗕𝘂𝗶𝗹𝗱𝗶𝗻𝗴 𝗮 𝗧𝘆𝗽𝗲-𝗦𝗮𝗳𝗲 𝗩𝗶𝗱𝗲𝗼 𝗔𝗣𝗜 𝗦𝗗𝗞 𝗶𝗻 𝗥𝘂𝘀𝘁
ডেটা করাপশন (Data corruption) প্রায়শই নিঃশব্দে ঘটে।
গত প্রান্তিকে, আমার ব্যাকএন্ড আটটি অঞ্চল থেকে ভিডিও মেটাডেটা সংগ্রহ করেছিল। পুরনো সিস্টেমে একটি PHP স্ক্রিপ্ট ব্যবহার করা হতো। এটি ততক্ষণ পর্যন্ত কাজ করছিল যতক্ষণ না একজন প্রোভাইডার একটি ফিল্ড পরিবর্তন করেন। একটি মাত্র ভুল ফরম্যাটের টাইমস্ট্যাম্পের কারণে স্ক্রিপ্টটি আমাদের ডেটাবেসে ভুল বা আবর্জনাপূর্ণ (garbage) রো লিখে ফেলেছিল।
আমরা তিন দিন পর্যন্ত এটি লক্ষ্য করিনি। সিস্টেমটি ক্র্যাশ করেনি। এটি ব্যবহারকারীদের কাছে শুধু খালি টাইটেল দেখাচ্ছিল।
আমি ফেচ লেয়ারটি (fetch layer) একটি Rust SDK দিয়ে প্রতিস্থাপন করেছি। আমি Rust বেছে নিয়েছি কারণ reqwest এবং serde একটি কঠোর ডেটা কন্ট্রাক্ট (data contract) নিশ্চিত করে। যদি ডেটা ভুল হয়, তবে সিস্টেমটি সীমানাতেই (boundary) স্পষ্টভাবে ত্রুটি দেখায়। এটি ডেটাবেসে ভুল ডেটা লেখে না।
আমরা এটি যেভাবে তৈরি করেছি তা নিচে দেওয়া হলো:
• ডেটা কন্ট্রাক্ট (Data Contract) সংজ্ঞায়িত করা একটি ভিডিও দেখতে ঠিক কেমন হবে তা সুনির্দিষ্টভাবে সংজ্ঞায়িত করতে আমি serde ব্যবহার করেছি। যে ফিল্ডগুলো অনুপস্থিত থাকতে পারে সেগুলোর জন্য আমি Option ব্যবহার করেছি। বিভিন্ন তারিখের ফরম্যাট সামলানোর জন্য আমি টাইমস্ট্যাম্পের জন্য একটি কাস্টম ডিজিরিয়ালাইজার (deserializer) ব্যবহার করেছি। এটি পুরনো সিস্টেমগুলোতে সাধারণ "1970-01-01" ত্রুটি প্রতিরোধ করে।
• ত্রুটিগুলো শ্রেণীবদ্ধ করা একটি ভালো SDK আপনাকে জানায় কেন একটি রিকোয়েস্ট ব্যর্থ হয়েছে। আমি একটি নির্দিষ্ট ত্রুটির তালিকা তৈরি করতে thiserror ব্যবহার করেছি। আমি রেট লিমিটের মতো সাময়িক ত্রুটিগুলোকে (transient errors) আনঅথরাইজড অ্যাক্সেসের মতো মারাত্মক ত্রুটি (fatal errors) থেকে আলাদা করেছি। এটি সিস্টেমকে সম্পদ অপচয় না করে বুদ্ধিদীপ্তভাবে পুনরায় চেষ্টা (retry) করার সুযোগ দেয়।
• কানেকশন ম্যানেজ করা একটি কানেকশন পুল (connection pool) বজায় রাখতে আমি reqwest::Client ব্যবহার করেছি। এটি প্রতিটি রিকোয়েস্টের জন্য নতুন TLS হ্যান্ডশেক শুরু করার অতিরিক্ত ঝামেলা (overhead) এড়াতে সাহায্য করে।
• স্ট্রিম (Streams) দিয়ে লজিক সহজ করা পেজিনেশন (pagination) সামলানোর জন্য আমি async_stream ব্যবহার করেছি। কলারের (caller) জন্য পেজ টোকেন ম্যানেজ করার প্রয়োজন নেই। তারা কেবল ভিডিওর একটি স্ট্রিমের মধ্য দিয়ে ইটারেট (iterate) করে।
এর ফলে এমন একটি সিস্টেম তৈরি হয়েছে যা ডেটাবেসকে সুরক্ষিত রাখে। মূল ওয়েবসাইটটি এখনও PHP-তে চলে। ডেটাবেসটি এখনও SQLite। কিন্তু ডেটাবেসে প্রবেশ করা ডেটা এখন নিশ্চিতভাবেই পরিষ্কার।
টাইপ সেফটি (type safety) পেতে আপনার পুরো অ্যাপটি পুনরায় লেখার প্রয়োজন নেই। আপনাকে শুধু ভ্যালিডেশন প্রক্রিয়াটি সেই পয়েন্টে নিয়ে যেতে হবে যেখানে ডেটা আপনার সিস্টেমে প্রবেশ করে।