𝗕𝘂𝗶𝗹𝗱𝗶𝗻𝗴 𝗮 𝗧𝘆𝗽𝗲-𝗦𝗮𝗳𝗲 𝗩𝗶𝗱𝗲𝗼 𝗔𝗣𝗜 𝗦𝗗𝗞 𝗶𝗻 𝗥𝘂𝘀𝘁
డేటా కరప్షన్ (Data corruption) తరచుగా నిశ్శబ్దంగా జరుగుతుంది.
గత త్రైమాసికంలో, నా బ్యాకెండ్ ఎనిమిది ప్రాంతాల నుండి వీడియో మెటాడేటాను సేకరించింది. పాత సిస్టమ్ PHP స్క్రిప్ట్ను ఉపయోగించేది. ఒక ప్రొవైడర్ ఒక ఫీల్డ్ను మార్చే వరకు అది బాగానే పనిచేసింది. ఒకే ఒక తప్పుగా ఉన్న టైమ్స్టాంప్ (malformed timestamp) కారణంగా, ఆ స్క్రిప్ట్ మా డేటాబేస్లోకి చెత్త డేటా (garbage rows) రాయడానికి కారణమైంది.
మేము మూడు రోజుల వరకు గమనించలేదు. సిస్టమ్ క్రాష్ కాలేదు. అది వినియోగదారులకు కేవలం ఖాళీ టైటిళ్లను మాత్రమే చూపించింది.
నేను ఫెచ్ లేయర్ను (fetch layer) Rust SDKతో భర్తీ చేశాను. నేను Rustని ఎంచుకోవడానికి కారణం reqwest మరియు serde కఠినమైన డేటా కాంట్రాక్ట్ను అమలు చేస్తాయి. డేటా తప్పుగా ఉంటే, సిస్టమ్ సరిహద్దులోనే (boundary) స్పష్టంగా లోపాన్ని చూపుతుంది. ఇది డేటాబేస్లోకి తప్పుడు డేటాను రాయదు.
మేము దీనిని ఎలా నిర్మించామో ఇక్కడ ఉంది:
• డేటా కాంట్రాక్ట్ను నిర్వచించడం (Define the Data Contract) వీడియో ఖచ్చితంగా ఎలా ఉండాలో నిర్వచించడానికి నేను serdeని ఉపయోగించాను. మిస్ అయ్యే అవకాశం ఉన్న ఫీల్డ్ల కోసం నేను Optionని ఉపయోగించాను. వివిధ తేదీ ఫార్మాట్లను హ్యాండిల్ చేయడానికి టైమ్స్టాంప్ల కోసం నేను ఒక కస్టమ్ డీసీరియలైజర్ను (custom deserializer) ఉపయోగించాను. ఇది పాత సిస్టమ్లలో సాధారణంగా కనిపించే "1970-01-01" ఎర్రర్ను నివారిస్తుంది.
• ఎర్రర్లను వర్గీకరించడం (Categorize Errors) ఒక మంచి SDK రిక్వెస్ట్ ఎందుకు విఫలమైందో మీకు చెబుతుంది. ఒక నిర్దిష్ట ఎర్రర్ జాబితాను రూపొందించడానికి నేను thiserrorని ఉపయోగించాను. రేట్ లిమిట్స్ (rate limits) వంటి తాత్కాలిక ఎర్రర్లను, అన్అథరైజ్డ్ యాక్సెస్ (unauthorized access) వంటి ఫేటల్ ఎర్రర్ల నుండి నేను వేరు చేశాను. ఇది వనరులను వృథా చేయకుండా, సిస్టమ్ తెలివిగా మళ్ళీ ప్రయత్నించేలా (retry) చేస్తుంది.
• కనెక్షన్లను నిర్వహించడం (Manage Connections) కనెక్షన్ పూల్ను నిర్వహించడానికి నేను reqwest::Clientని ఉపయోగించాను. ఇది ప్రతి రిక్వెస్ట్కు కొత్త TLS హ్యాండ్షేక్లను ప్రారంభించే ఓవర్హెడ్ను నివారిస్తుంది.
• స్ట్రీమ్స్తో లాజిక్ను సరళీకరించడం (Simplify Logic with Streams) పేజినేషన్ను (pagination) హ్యాండిల్ చేయడానికి నేను async_streamని ఉపయోగించాను. కాల్ చేసే వ్యక్తి పేజీ టోకెన్లను నిర్వహించాల్సిన అవసరం లేదు. వారు కేవలం వీడియోల స్ట్రీమ్ ద్వారా ఇటరేట్ (iterate) చేస్తే సరిపోతుంది.
దీని ఫలితంగా డేటాబేస్ను రక్షించే ఒక సిస్టమ్ తయారైంది. ప్రధాన వెబ్సైట్ ఇంకా PHPపైనే నడుస్తోంది. డేటాబేస్ ఇంకా SQLiteయే. కానీ డేటాబేస్లోకి ప్రవేశించే డేటా ఇప్పుడు ఖచ్చితంగా శుభ్రంగా (clean) ఉంటుందని గ్యారెంటీ ఉంది.
టైప్ సేఫ్టీ (type safety) పొందడానికి మీరు మీ మొత్తం యాప్ను తిరిగి వ్రాయాల్సిన అవసరం లేదు. డేటా మీ సిస్టమ్లోకి ప్రవేశించే చోట వాలిడేషన్ను (validation) మళ్లించడమే మీరు చేయవలసిన పని.