𝗕𝘂𝗶𝗹𝗱𝗶𝗻𝗴 𝗮 𝗧𝘆𝗽𝗲-𝗦𝗮𝗳𝗲 𝗩𝗶𝗱𝗲𝗼 𝗔𝗣𝗜 𝗦𝗗𝗞 𝗶𝗻 𝗥𝘂𝘀𝘁
தரவு சிதைவு (Data corruption) பெரும்பாலும் அமைதியாகவே நடக்கும்.
கடந்த காலாண்டில், எனது backend எட்டுப் பகுதிகளிலிருந்து (regions) வீடியோ மெட்டாடேட்டாவைப் (video metadata) பெற்றது. பழைய முறையில் ஒரு PHP ஸ்கிரிப்ட் பயன்படுத்தப்பட்டது. ஒரு சேவை வழங்குநர் (provider) ஒரு புலத்தை (field) மாற்றும் வரை அது சரியாகவே இயங்கியது. தவறான முறையில் அமைக்கப்பட்ட ஒரு நேர முத்திரை (timestamp), ஸ்கிரிப்ட் நமது தரவுத்தளத்தில் குப்பையான தரவு வரிசைகளை (garbage rows) எழுதக் காரணமாகிவிட்டது.
மூன்று நாட்களாக நாங்கள் இதைக் கவனிக்கவில்லை. சிஸ்டம் செயலிழக்கவில்லை (crash). பயனர்களுக்கு வெறும் காலியான தலைப்புகளை மட்டுமே காட்டியது.
நான் fetch லேயரை ஒரு Rust SDK-ஆல் மாற்றினேன். reqwest மற்றும் serde ஆகியவை ஒரு கடுமையான தரவு ஒப்பந்தத்தை (data contract) உறுதி செய்வதால் நான் Rust-ஐத் தேர்ந்தெடுத்தேன். தரவு தவறாக இருந்தால், சிஸ்டம் அதன் எல்லையிலேயே (boundary) உடனடியாகத் தோல்வியடையும். இது தவறான தரவை தரவுத்தளத்தில் எழுதாது.
நாங்கள் அதை எவ்வாறு உருவாக்கினோம் என்பது இதோ:
• தரவு ஒப்பந்தத்தை வரையறுத்தல் (Define the Data Contract) ஒரு வீடியோ சரியாக எப்படி இருக்க வேண்டும் என்பதை வரையறுக்க நான் serde-ஐப் பயன்படுத்தினேன். விடுபட்டிருக்கக்கூடிய புலங்களுக்கு (fields) நான் Option-ஐப் பயன்படுத்தினேன். பல்வேறு தேதி வடிவங்களைக் கையாள நேர முத்திரைகளுக்கு (timestamps) ஒரு தனிப்பயன் டிசீரியலைசரை (custom deserializer) பயன்படுத்தினேன். இது பழைய சிஸ்டங்களில் பொதுவாகக் காணப்படும் "1970-01-01" பிழையைத் தடுக்கிறது.
• பிழைகளை வகைப்படுத்துதல் (Categorize Errors) ஒரு சிறந்த SDK, ஒரு கோரிக்கை (request) ஏன் தோல்வியடைந்தது என்பதை உங்களுக்குத் தெரிவிக்கும். ஒரு குறிப்பிட்ட பிழைப் பட்டியலை உருவாக்க நான் thiserror-ஐப் பயன்படுத்தினேன். rate limits போன்ற தற்காலிகப் பிழைகளை (transient errors), unauthorized access போன்ற கடுமையான பிழைகளிலிருந்து (fatal errors) நான் பிரித்தேன். இது வளங்களை வீணாக்குவதற்குப் பதிலாக, சிஸ்டம் புத்திசாலித்தனமாக மீண்டும் முயற்சிக்க (retry) அனுமதிக்கிறது.
• இணைப்புகளை நிர்வகித்தல் (Manage Connections) ஒரு connection pool-ஐப் பராமரிக்க நான் reqwest::Client-ஐப் பயன்படுத்தினேன். இது ஒவ்வொரு கோரிக்கைக்கும் புதிய TLS handshakes-களைத் தொடங்குவதால் ஏற்படும் கூடுதல் சுமையைத் (overhead) தவிர்க்கிறது.
• Streams மூலம் தர்க்கத்தை எளிமையாக்குதல் (Simplify Logic with Streams) பக்கங்களைப் பிரிப்பதைப் (pagination) கையாள நான் async_stream-ஐப் பயன்படுத்தினேன். அழைப்பவர் (caller) page tokens-களை நிர்வகிக்க வேண்டிய அவசியமில்லை. அவர்கள் வீடியோக்களின் ஒரு stream மூலம் எளிதாகச் சுழற்சி முறையில் (iterate) அணுகலாம்.
இதன் விளைவாக தரவுத்தளத்தைப் பாதுகாக்கும் ஒரு சிஸ்டம் கிடைத்துள்ளது. முக்கிய இணையதளம் இன்னும் PHP-யிலேயே இயங்குகிறது. தரவுத்தளம் இன்னும் SQLite-ஆகவே உள்ளது. ஆனால் தரவுத்தளத்திற்குள் நுழையும் தரவு இப்போது சுத்தமாக இருப்பதே உறுதி செய்யப்படுகிறது.
Type safety-ஐப் பெற உங்கள் முழு செயலையும் (app) மீண்டும் எழுத வேண்டிய அவசியமில்லை. தரவு உங்கள் சிஸ்டத்திற்குள் நுழையும் இடத்திலேயே சரிபார்ப்பைச் (validation) செய்யத் தொடங்கினால் போதுமானது.