Rust ഉപയോഗിച്ച് ഒരു Type-Safe Video API SDK നിർമ്മിക്കുന്നു
ഡാറ്റാ കറപ്ഷൻ (Data corruption) പലപ്പോഴും നിശബ്ദമായിട്ടാണ് സംഭവിക്കുന്നത്.
കഴിഞ്ഞ പാദത്തിൽ, എന്റെ ബാക്കെൻഡ് എട്ട് റീജിയനുകളിൽ നിന്ന് വീഡിയോ മെറ്റാഡാറ്റ (video metadata) ശേഖരിച്ചു. പഴയ സിസ്റ്റത്തിൽ ഒരു PHP സ്ക്രിപ്റ്റാണ് ഉപയോഗിച്ചിരുന്നത്. ഒരു പ്രൊവൈഡർ ഒരു ഫീൽഡ് മാറ്റുന്നത് വരെ അത് കൃത്യമായി പ്രവർത്തിച്ചു കൊണ്ടിരുന്നു. എന്നാൽ ഒരു തെറ്റായ ടൈംസ്റ്റാമ്പ് (timestamp) കാരണം സ്ക്രിപ്റ്റ് നമ്മുടെ ഡാറ്റാബേസിലേക്ക് തെറ്റായ വിവരങ്ങൾ (garbage rows) എഴുതാൻ ഇടയാക്കി.
മൂന്ന് ദിവസത്തോളം ഞങ്ങൾ ഇത് ശ്രദ്ധിച്ചതേയില്ല. സിസ്റ്റം ക്രാഷ് ആകുകയുമില്ല. ഉപയോക്താക്കൾക്ക് വെറും ശൂന്യമായ ടൈറ്റിലുകൾ മാത്രമാണ് കാണിച്ചുകൊണ്ടിരുന്നത്.
ഞാൻ ഫെച്ച് ലെയറിന് (fetch layer) പകരം ഒരു Rust SDK ഉപയോഗിച്ചു. reqwest, serde എന്നിവ കർശനമായ ഒരു ഡാറ്റാ കോൺട്രാക്ട് (data contract) ഉറപ്പാക്കുന്നതുകൊണ്ടാണ് ഞാൻ Rust തിരഞ്ഞെടുത്തത്. ഡാറ്റ തെറ്റാണെങ്കിൽ, സിസ്റ്റം അതിന്റെ അതിർത്തിയിൽ വെച്ച് തന്നെ അത് വ്യക്തമായി അറിയിക്കും (fails loudly). ഇത് ഡാറ്റാബേസിലേക്ക് തെറ്റായ വിവരങ്ങൾ എഴുതുന്നത് തടയുന്നു.
ഞങ്ങൾ ഇത് നിർമ്മിച്ചത് ഇപ്രകാരമാണ്:
• ഡാറ്റാ കോൺട്രാക്ട് നിർവചിക്കുക (Define the Data Contract)
ഒരു വീഡിയോയുടെ ഘടന കൃത്യമായി നിർവചിക്കാൻ ഞാൻ serde ഉപയോഗിച്ചു. വിട്ടുപോയിരിക്കാൻ സാധ്യതയുള്ള ഫീൽഡുകൾക്കായി ഞാൻ Option ഉപയോഗിച്ചു. വ്യത്യസ്ത ഡേറ്റ് ഫോർമാറ്റുകൾ കൈകാര്യം ചെയ്യാൻ ടൈംസ്റ്റാമ്പുകൾക്കായി ഒരു കസ്റ്റം ഡീസീരിയലൈസർ (custom deserializer) ഞാൻ ഉപയോഗിച്ചു. ഇത് പഴയ സിസ്റ്റങ്ങളിൽ സാധാരണയായി കാണാറുള്ള "1970-01-01" എന്ന പിശക് ഒഴിവാക്കുന്നു.
• പിശകുകളെ തരംതിരിക്കുക (Categorize Errors)
ഒരു നല്ല SDK ഒരു റിക്വസ്റ്റ് പരാജയപ്പെട്ടതിന്റെ കാരണം കൃത്യമായി പറഞ്ഞുതരുന്നു. പ്രത്യേകമായ ഒരു എറർ ലിസ്റ്റ് നിർമ്മിക്കാൻ ഞാൻ thiserror ഉപയോഗിച്ചു. റേറ്റ് ലിമിറ്റുകൾ (rate limits) പോലുള്ള താൽക്കാലിക പിശകുകളെ (transient errors), അനൗതറൈസ്ഡ് ആക്സസ് (unauthorized access) പോലുള്ള ഗുരുതരമായ പിശകുകളിൽ (fatal errors) നിന്ന് ഞാൻ വേർതിരിച്ചു. ഇത് വിഭവങ്ങൾ പാഴാക്കുന്നതിന് പകരം ബുദ്ധിപരമായ തീരുമാനങ്ങളിലൂടെ സിസ്റ്റത്തിന് വീണ്ടും ശ്രമിക്കാൻ (retry) സഹായിക്കുന്നു.
• കണക്ഷനുകൾ നിയന്ത്രിക്കുക (Manage Connections)
ഒരു കണക്ഷൻ പൂൾ (connection pool) നിലനിർത്താൻ ഞാൻ reqwest::Client ഉപയോഗിച്ചു. ഇത് ഓരോ റിക്വസ്റ്റിനും പുതിയ TLS ഹാൻഡ്ഷേക്കുകൾ (TLS handshakes) തുടങ്ങുന്നതിലൂടെ ഉണ്ടാകുന്ന അധിക ജോലി (overhead) ഒഴിവാക്കുന്നു.
• സ്ട്രീമുകൾ ഉപയോഗിച്ച് ലോജിക് ലളിതമാക്കുക (Simplify Logic with Streams)
പേജിനേഷൻ (pagination) കൈകാര്യം ചെയ്യാൻ ഞാൻ async_stream ഉപയോഗിച്ചു. പേജ് ടോക്കണുകൾ (page tokens) മാനേജ് ചെയ്യേണ്ട ആവശ്യമില്ല. ഉപയോക്താവിന് വീഡിയോകളുടെ ഒരു സ്ട്രീമിലൂടെ ലളിതമായി മുന്നോട്ട് പോകാം.
ഇതിന്റെ ഫലമായി ഡാറ്റാബേസിനെ സംരക്ഷിക്കുന്ന ഒരു സിസ്റ്റം ലഭിച്ചു. പ്രധാന വെബ്സൈറ്റ് ഇപ്പോഴും PHPയിലാണ് പ്രവർത്തിക്കുന്നത്. ഡാറ്റാബേസ് ഇപ്പോഴും SQLite തന്നെയാണ്. എന്നാൽ ഡാറ്റാബേസിലേക്ക് പ്രവേശിക്കുന്ന ഡാറ്റ ശുദ്ധമാണെന്ന് ഇപ്പോൾ ഉറപ്പാണ്.
ടൈപ്പ് സേഫ്റ്റി (type safety) ലഭിക്കുന്നതിനായി നിങ്ങളുടെ മുഴുവൻ ആപ്പും വീണ്ടും എഴുതേണ്ടതില്ല. ഡാറ്റ നിങ്ങളുടെ സിസ്റ്റത്തിലേക്ക് പ്രവേശിക്കുന്ന ഘട്ടത്തിൽ തന്നെ വാലിഡേഷൻ (validation) കൊണ്ടുവന്നാൽ മാത്രം മതി.