𝗕𝘂𝗶𝗹𝗱𝗶𝗻𝗴 𝗮 𝗧𝘆𝗽𝗲-𝗦𝗮𝗳𝗲 𝗩𝗶𝗱𝗲𝗼 𝗔𝗣𝗜 𝗦𝗗𝗞 𝗶𝗻 𝗥𝘂𝘀𝘁
ਡੇਟਾ ਕਰੱਪਸ਼ਨ ਅਕਸਰ ਚੁੱਪਚਾਪ ਹੁੰਦੀ ਹੈ।
ਪਿਛਲੀ ਤਿਮਾਹੀ ਵਿੱਚ, ਮੇਰੇ ਬੈਕਐਂਡ (backend) ਨੇ ਅੱਠ ਖੇਤਰਾਂ ਤੋਂ ਵੀਡੀਓ ਮੈਟਾਡਾਟਾ (video metadata) ਕੱਢਿਆ। ਪੁਰਾਣਾ ਸਿਸਟਮ ਇੱਕ PHP ਸਕ੍ਰਿਪਟ ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਸੀ। ਇਹ ਉਦੋਂ ਤੱਕ ਕੰਮ ਕਰਦਾ ਰਿਹਾ ਜਦੋਂ ਤੱਕ ਇੱਕ ਪ੍ਰੋਵਾਈਡਰ ਨੇ ਇੱਕ ਫੀਲਡ ਨਹੀਂ ਬਦਲੀ। ਇੱਕ ਗਲਤ ਟਾਈਮਸਟੈਂਪ (timestamp) ਕਾਰਨ ਸਕ੍ਰਿਪਟ ਨੇ ਸਾਡੇ ਡੇਟਾਬੇਸ ਵਿੱਚ ਗਲਤ (garbage) ਰੋਅਜ਼ (rows) ਲਿਖ ਦਿੱਤੇ।
ਅਸੀਂ ਤਿੰਨ ਦਿਨਾਂ ਤੱਕ ਇਸ ਵੱਲ ਧਿਆਨ ਨਹੀਂ ਦਿੱਤਾ। ਸਿਸਟਮ ਕ੍ਰੈਸ਼ ਨਹੀਂ ਹੋਇਆ। ਇਸਨੇ ਬੱਸ ਯੂਜ਼ਰਸ ਨੂੰ ਖਾਲੀ ਟਾਈਟਲ ਦਿਖਾਏ।
ਮੈਂ fetch layer ਨੂੰ Rust SDK ਨਾਲ ਬਦਲ ਦਿੱਤਾ। ਮੈਂ Rust ਨੂੰ ਇਸ ਲਈ ਚੁਣਿਆ ਕਿਉਂਕਿ reqwest ਅਤੇ serde ਇੱਕ ਸਖ਼ਤ ਡੇਟਾ ਕੰਟਰੈਕਟ (data contract) ਲਾਗੂ ਕਰਦੇ ਹਨ। ਜੇਕਰ ਡੇਟਾ ਗਲਤ ਹੈ, ਤਾਂ ਸਿਸਟਮ ਸੀਮਾ (boundary) 'ਤੇ ਹੀ ਫੇਲ ਹੋ ਜਾਂਦਾ ਹੈ। ਇਹ ਡੇਟਾਬੇਸ ਵਿੱਚ ਗਲਤ ਡੇਟਾ ਨਹੀਂ ਲਿਖਦਾ।
ਅਸੀਂ ਇਸਨੂੰ ਇਸ ਤਰ੍ਹਾਂ ਬਣਾਇਆ:
• ਡੇਟਾ ਕੰਟਰੈਕਟ (Data Contract) ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰੋ ਮੈਂ ਵੀਡੀਓ ਦੇ ਰੂਪ ਨੂੰ ਸਹੀ ਤਰ੍ਹਾਂ ਪਰਿਭਾਸ਼ਿਤ ਕਰਨ ਲਈ serde ਦੀ ਵਰਤੋਂ ਕੀਤੀ। ਮੈਂ ਉਹਨਾਂ ਫੀਲਡਸ ਲਈ Option ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜੋ ਗੁੰਮ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਮੈਂ ਵੱਖ-ਵੱਖ ਡੇਟ ਫਾਰਮੈਟਾਂ ਨੂੰ ਸੰਭਾਲਣ ਲਈ ਟਾਈਮਸਟੈਂਪਸ ਲਈ ਇੱਕ ਕਸਟਮ ਡੀਸੀਰੀਅਲਾਈਜ਼ਰ (custom deserializer) ਦੀ ਵਰਤੋਂ ਕੀਤੀ। ਇਹ ਪੁਰਾਣੇ ਸਿਸਟਮਾਂ ਵਿੱਚ ਆਮ ਹੋਣ ਵਾਲੀ "1970-01-01" ਵਾਲੀ ਗਲਤੀ ਨੂੰ ਰੋਕਦਾ ਹੈ।
• ਗਲਤੀਆਂ (Errors) ਨੂੰ ਸ਼੍ਰੇਣੀਬੱਧ ਕਰੋ ਇੱਕ ਚੰਗਾ SDK ਤੁਹਾਨੂੰ ਦੱਸਦਾ ਹੈ ਕਿ ਰਿਕਵੈਸਟ (request) ਕਿਉਂ ਫੇਲ ਹੋਈ। ਮੈਂ ਇੱਕ ਖਾਸ ਐਰਰ ਲਿਸਟ ਬਣਾਉਣ ਲਈ thiserror ਦੀ ਵਰਤੋਂ ਕੀਤੀ। ਮੈਂ ਰੇਟ ਲਿਮਿਟਸ (rate limits) ਵਰਗੀਆਂ ਅਸਥਾਈ ਗਲਤੀਆਂ ਨੂੰ ਅਨਅਥੋਰਾਈਜ਼ਡ ਐਕਸੈਸ (unauthorized access) ਵਰਗੀਆਂ ਗੰਭੀਰ ਗਲਤੀਆਂ ਤੋਂ ਵੱਖ ਕੀਤਾ। ਇਹ ਸਿਸਟਮ ਨੂੰ ਸਰੋਤਾਂ ਨੂੰ ਬਰਬਾਦ ਕਰਨ ਦੀ ਬਜਾਏ ਸਮਝਦਾਰੀ ਨਾਲ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ (retry) ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦਾ ਹੈ।
• ਕਨੈਕਸ਼ਨਾਂ (Connections) ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ ਮੈਂ ਕਨੈਕਸ਼ਨ ਪੂਲ (connection pool) ਨੂੰ ਬਣਾਈ ਰੱਖਣ ਲਈ reqwest::Client ਦੀ ਵਰਤੋਂ ਕੀਤੀ। ਇਹ ਹਰ ਰਿਕਵੈਸਟ ਲਈ ਨਵੇਂ TLS handshakes ਸ਼ੁਰੂ ਕਰਨ ਦੇ ਵਾਧੂ ਬੋਝ (overhead) ਤੋਂ ਬਚਾਉਂਦਾ ਹੈ।
• Streams ਨਾਲ ਲੌਜਿਕ ਨੂੰ ਸਰਲ ਬਣਾਓ ਮੈਂ ਪੇਜਿਨੇਸ਼ਨ (pagination) ਨੂੰ ਸੰਭਾਲਣ ਲਈ async_stream ਦੀ ਵਰਤੋਂ ਕੀਤੀ। ਕਾਲਰ (caller) ਨੂੰ ਪੇਜ ਟੋਕਨਾਂ (page tokens) ਦੇ ਪ੍ਰਬੰਧਨ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ। ਉਹ ਸਿਰਫ਼ ਵੀਡੀਓਜ਼ ਦੀ ਇੱਕ stream ਰਾਹੀਂ ਇਟਰੇਟ (iterate) ਕਰਦੇ ਹਨ।
ਨਤੀਜਾ ਇੱਕ ਅਜਿਹਾ ਸਿਸਟਮ ਹੈ ਜੋ ਡੇਟਾਬੇਸ ਦੀ ਰੱਖਿਆ ਕਰਦਾ ਹੈ। ਮੁੱਖ ਵੈੱਬਸਾਈਟ ਅਜੇ ਵੀ PHP 'ਤੇ ਚੱਲਦੀ ਹੈ। ਡੇਟਾਬੇਸ ਅਜੇ ਵੀ SQLite ਹੈ। ਪਰ ਡੇਟਾਬੇਸ ਵਿੱਚ ਜਾਣ ਵਾਲਾ ਡੇਟਾ ਹੁਣ ਸਾਫ਼ ਹੋਣ ਦੀ ਗਾਰੰਟੀ ਹੈ।
Type safety ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ ਆਪਣੀ ਪੂਰੀ ਐਪ ਨੂੰ ਦੁਬਾਰਾ ਲਿਖਣ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ। ਤੁਹਾਨੂੰ ਸਿਰਫ਼ ਵੈਲੀਡੇਸ਼ਨ (validation) ਨੂੰ ਉਸ ਬਿੰਦੂ 'ਤੇ ਲਿਆਉਣ ਦੀ ਲੋੜ ਹੈ ਜਿੱਥੇ ਡੇਟਾ ਤੁਹਾਡੇ ਸਿਸਟਮ ਵਿੱਚ ਦਾਖਲ ਹੁੰਦਾ ਹੈ।