ഒരു വീഡിയോ URL കാനോണിക്കലൈസേഷൻ പൈപ്പ്ലൈൻ നിർമ്മിക്കുന്നു
എന്റെ പ്രൊഡക്ഷൻ SQLite ഡാറ്റാബേസിൽ ഞാൻ ഒരു ക്വറി റൺ ചെയ്തപ്പോൾ വലിയൊരു പ്രശ്നം കണ്ടെത്തി.
'videos' ടേബിളിൽ 41,283 വരികളുണ്ടായിരുന്നു, എന്നാൽ 29,000 യുണീക് ടൈറ്റിലുകൾ മാത്രമേ ഉണ്ടായിരുന്നുള്ളൂ. ഒരേ വീഡിയോകൾ തന്നെ പലതവണ ഞങ്ങൾ സ്റ്റോർ ചെയ്തിരുന്നു.
എന്തുകൊണ്ടാണ് ഇത് സംഭവിച്ചത്? ഒരേ YouTube വീഡിയോ തന്നെ വ്യത്യസ്ത URL ഫോർമാറ്റുകളിൽ എത്തി:
• ഷോർട്ട് ലിങ്കുകൾ: youtu.be/ID • ഡെസ്ക്ടോപ്പ് ലിങ്കുകൾ: youtube.com/watch?v=ID • മൊബൈൽ ലിങ്കുകൾ: m.youtube.com/watch?v=ID • ഷോർട്ട്സ്: youtube.com/shorts/ID
ഒരു വീഡിയോ എന്നാൽ നാല് ഡാറ്റാബേസ് വരികളും നാല് സമാനമായ വെബ് പേജുകളും എന്നാണ് അർത്ഥം. ഇത് എന്റെ ക്രോൾ ബജറ്റ് (crawl budget) പാഴാക്കുകയും Google Search Console-ൽ പിശകുകൾ (errors) കാണിക്കുകയും ചെയ്തു.
ഞാൻ TrendVidStream നടത്തുന്നു. ഞങ്ങൾ എട്ട് വ്യത്യസ്ത മേഖലകളിൽ നിന്നുള്ള ട്രെൻഡിംഗ് ഡാറ്റ ശേഖരിക്കുന്നു. ഓരോ മേഖലയിൽ നിന്നും ഒരേ വൈറൽ വീഡിയോ തന്നെ വ്യത്യസ്ത URL രൂപങ്ങളിൽ പ്രത്യക്ഷപ്പെട്ടേക്കാം.
ഇത് പരിഹരിക്കുന്നതിനായി PHP 8.4 ഉം SQLite ഉം ഉപയോഗിച്ച് ഞാൻ ഒരു പൈപ്പ്ലൈൻ നിർമ്മിച്ചു.
പൈപ്പ്ലൈൻ എങ്ങനെയാണ് പ്രവർത്തിക്കുന്നത് എന്ന് താഴെ നൽകുന്നു:
- Extract: ഏതൊരു URL വേരിയന്റും ഒരു സ്ഥിരമായ 11-അക്ഷര വീഡിയോ ID ആക്കി മാറ്റുക.
- Normalize: ആ ID ഉപയോഗിച്ച് ഒരൊറ്റ കാനോണിക്കൽ (canonical) URL നിർമ്മിക്കുക.
- Validate: ഡാറ്റാബേസിൽ മാറ്റം വരുത്തുന്നതിന് മുമ്പ് വേഗത്തിലുള്ള പരിശോധനകൾ നടത്തുക.
- Upsert: പുതിയ വരികൾ ചേർക്കുന്നതിന് പകരം ഡാറ്റ സംയോജിപ്പിക്കാൻ SQLite UPSERT ഉപയോഗിക്കുക.
- Emit: സെർച്ച് എഞ്ചിനുകൾക്ക് ഒരൊറ്റ URL കണ്ടെത്താനായി കാനോണിക്കൽ ടാഗുകളും 301 റീഡയറക്റ്റുകളും ചേർക്കുക.
പ്രധാന സാങ്കേതിക തീരുമാനങ്ങൾ:
• കൃത്യമായ ഒരു ഹോസ്റ്റ് അലൗലിസ്റ്റ് (allowlist) ഉപയോഗിക്കുക. സഫിക്സ് മാച്ചിംഗ് (suffix matching) ഉപയോഗിക്കരുത്. ഇത് സുരക്ഷാ പ്രശ്നങ്ങൾ ഒഴിവാക്കും. • ഒരിക്കലും ID-കൾ ലോവർകേസ് (lowercase) ചെയ്യരുത്. YouTube ID-കൾ കേസ്-സെൻസിറ്റീവ് (case-sensitive) ആണ്. അവ ലോവർകേസ് ചെയ്യുന്നത് വ്യത്യസ്ത വീഡിയോകളെ ഒന്നിപ്പിക്കാൻ കാരണമാകും. • video_id-യിൽ ഒരു UNIQUE കൺസ്ട്രയിന്റ് (constraint) ഉപയോഗിക്കുക. ഡ്യൂപ്ലിക്കേറ്റുകൾക്കെതിരെയുള്ള നിങ്ങളുടെ ഏറ്റവും ശക്തമായ പ്രതിരോധമാണിത്. • SQLite WAL മോഡ് ഉപയോഗിക്കുക. ഇത് ഡാറ്റ എഴുതുന്നത് വേഗത്തിലും വിശ്വസനീയവുമാക്കുന്നു.
ഫലം:
ഞങ്ങളുടെ വീഡിയോ ടേബിളിലെ വരികൾ 41,283-ൽ നിന്ന് 28,094 ആയി കുറഞ്ഞു. ഒരു വീഡിയോ പോലും നഷ്ടപ്പെട്ടില്ല. Google Search Console പിശകുകൾ 412-ൽ നിന്ന് 9 ആയി കുറഞ്ഞു. ഒരേ വീഡിയോ തന്നെ നാല് തവണ കാണിക്കുന്നത് നിർത്തിയതിനാൽ സെർച്ച് റിസൾട്ടുകൾ കൂടുതൽ വ്യക്തമായി.
പാഠം ലളിതമാണ്: നിങ്ങൾ പല സ്രോതസ്സുകളിൽ നിന്ന് ഡാറ്റ ശേഖരിക്കുമ്പോൾ, ആദ്യം നിങ്ങളുടെ സിസ്റ്റത്തിൽ ഒരു ഐഡന്റിറ്റി (identity) നിർമ്മിക്കുക. ഒരു സ്ഥിരമായ ID വേർതിരിച്ചെടുക്കുക, ഡാറ്റാബേസ് കൺസ്ട്രയിന്റുകൾ ഉപയോഗിച്ച് അത് ഉറപ്പാക്കുക, കൂടാതെ ഓരോ റൈറ്റും ഐഡെംപോറ്റന്റ് (idempotent) ആണെന്ന് ഉറപ്പുവരുത്തുക.
നിങ്ങൾക്ക് സങ്കീർണ്ണമായ ടൂളുകൾ ആവശ്യമില്ല. PHP-യും SQLite-ഉം മതിയാകും.
