Monorepo ETL-നായി ഉപയോഗിക്കാവുന്ന 4 GitHub Actions പാറ്റേണുകൾ
ഒരു മോണോറെപ്പോയിൽ (monorepo) നിന്ന് മൂന്ന് സൈറ്റുകൾ പ്രവർത്തിപ്പിക്കുന്നത് പല പ്രശ്നങ്ങളും ഉണ്ടാക്കുന്നു. നിങ്ങൾക്ക് മൂന്ന് വ്യത്യസ്ത ETL ജോബുകൾ, മൂന്ന് കണ്ടന്റ് റീബിൽഡുകൾ (content rebuilds), മൂന്ന് ഡിപ്ലോയ്മെന്റ് പൈപ്പ്ലൈനുകൾ എന്നിവ നേരിടേണ്ടി വരും. ഇവ കൃത്യമായി ഏകോപിപ്പിച്ചില്ലെങ്കിൽ അവ തമ്മിൽ കൂട്ടിയിടിക്കാൻ (collide) സാധ്യതയുണ്ട്.
ഈ സെറ്റപ്പ് സ്ഥിരപ്പെടുത്തുന്നതിനായി ഷെഡ്യൂളുകൾ പരീക്ഷിച്ചുകൊണ്ട് ഞാൻ ആറ് ആഴ്ചകൾ ചെലവഴിച്ചു. ഞാൻ ഉപയോഗിക്കുന്ന നാല് പാറ്റേണുകൾ താഴെ പറയുന്നവയാണ്.
1. Cron Jobs-നായി Time Offsets ഉപയോഗിക്കുക
എല്ലാ ETL ജോബുകളും ഒരേ സമയം പ്രവർത്തിപ്പിക്കുന്നത് പരാജയത്തിന് കാരണമാകും. ജോബുകൾ API rate limits-നായി മത്സരിക്കും. HuggingFace അല്ലെങ്കിൽ GitHub ഒരു 429 error നൽകിയാൽ, റൺ പരാജയപ്പെടും.
ഇത് ഒഴിവാക്കാൻ ഞാൻ 30 മിനിറ്റ് ഓഫ്സെറ്റുകൾ (offsets) ഉപയോഗിക്കുന്നു.
- ജോബ് ഒന്ന് 02:00-ന് ആരംഭിക്കുന്നു
- ജോബ് രണ്ട് 02:30-ന് ആരംഭിക്കുന്നു
- ജോബ് മൂന്ന് 03:00-ന് ആരംഭിക്കുന്നു
അടുത്ത ജോബ് ആരംഭിക്കുന്നതിന് മുമ്പ് ഒരു വലിയ ഡാറ്റാ പൾ (heavy pull) പൂർത്തിയാക്കാൻ മുപ്പത് മിനിറ്റ് മതിയാകും. ഇത് നിങ്ങളുടെ ലോഗുകൾ (logs) വൃത്തിയായി സൂക്ഷിക്കാനും API കൂട്ടിയിടികൾ ഒഴിവാക്കാനും സഹായിക്കുന്നു.
2. അനാവശ്യ റീബിൽഡുകൾ ഒഴിവാക്കാൻ Skip Flags ഉപയോഗിക്കുക
ഓരോ ETL ജോബും ഒരു Vercel ഡിപ്ലോയ്മെന്റോടെയാണ് അവസാനിക്കുന്നത്. ആർട്ടിക്കിൾ കമ്മറ്റുകൾ (article commits) റീബിൽഡുകൾക്ക് കാരണമാകുമ്പോൾ പ്രശ്നമുണ്ടാകുന്നു. കൃത്യമായ പ്ലാൻ ഇല്ലെങ്കിൽ, ഓരോ ആർട്ടിക്കിൾ അപ്ഡേറ്റും മൂന്ന് സൈറ്റുകളെയും റീബിൽഡ് ചെയ്യാൻ നിർബന്ധിതമാക്കും. ഇത് ബിൽഡ് മിനിറ്റുകൾ പാഴാക്കുന്നു.
ETL കമ്മറ്റ് മെസ്സേജുകളിൽ ഞാൻ [skip publish-articles] എന്ന ടാഗ് ഉപയോഗിക്കുന്നു.
ഈ ഫ്ലാഗ് പരിശോധിക്കുന്നതിനായി ഞാൻ എന്റെ വർക്ക്ഫ്ലോയിൽ (workflow) ഒരു സ്റ്റെപ്പ് ചേർത്തിട്ടുണ്ട്. ഈ ടാഗ് ഉണ്ടെങ്കിൽ, വർക്ക്ഫ്ലോ ബിൽഡ്, ഡിപ്ലോയ് സ്റ്റെപ്പുകൾ ഒഴിവാക്കുന്നു. ഇത് ETL പൈപ്പ്ലൈനുകളെ ആർട്ടിക്കിൾ പൈപ്പ്ലൈനുകളിൽ നിന്ന് വേർതിരിച്ചു നിർത്തുന്നു.
3. പ്രത്യേക സൈറ്റുകളെ ലക്ഷ്യം വെക്കാൻ Path Filters ഉപയോഗിക്കുക
ഒരു സൈറ്റിലെ അപ്ഡേറ്റ് മൂന്ന് ഡിപ്ലോയ്മെന്റുകൾക്ക് കാരണമാകുന്നത് നിങ്ങൾ ആഗ്രഹിക്കില്ല. ഓരോ സൈറ്റിന്റെയും വർക്ക്ഫ്ലോ അതിന്റെ സ്വന്തം ഫോൾഡറും ഷെയർഡ് പാക്കേജസ് (shared packages) ഫോൾഡറും മാത്രം നിരീക്ഷിക്കുന്ന രീതിയിൽ ഞാൻ കോൺഫിഗർ ചെയ്യുന്നു.
ഉദാഹരണത്തിന്:
- AI tools സൈറ്റ്
apps/ai-tools/മാത്രം നിരീക്ഷിക്കുന്നു - OSS സൈറ്റ്
apps/oss-alternatives/മാത്രം നിരീക്ഷിക്കുന്നു
നിങ്ങൾ ഷെയർഡ് ഡയറക്ടറിയിലെ കോഡ് മാറ്റിയാൽ എല്ലാ സൈറ്റുകളും റീബിൽഡ് ചെയ്യപ്പെടും. ഷെയർഡ് കോഡിലെ മാറ്റങ്ങൾ അപൂർവ്വമായതിനാൽ ഞാൻ ഈ സാഹചര്യം അംഗീകരിക്കുന്നു.
4. നിയന്ത്രണത്തിനായി Manual Dispatch ചേർക്കുക
ദൈനംദിന കാര്യങ്ങൾ Cron കൈകാര്യം ചെയ്യുന്നു. ബാക്കിയുള്ളവ Manual dispatch കൈകാര്യം ചെയ്യുന്നു. എനിക്ക് താഴെ പറയുന്ന കാര്യങ്ങൾ ചെയ്യാൻ സാധിക്കുന്നതിനായി ഞാൻ workflow_dispatch ഉപയോഗിക്കുന്നു:
- പരാജയപ്പെട്ട ഒരു ETL ജോബ് വീണ്ടും പ്രവർത്തിപ്പിക്കാൻ
- ഡാറ്റ ചേർത്തതിന് ശേഷം നിർബന്ധിതമായി ഒരു റിഫ്രഷ് നടത്താൻ
- ഡാറ്റാബേസിലേക്ക് എഴുതാതെ ഡാറ്റ പരിശോധിക്കാൻ ഒരു dry run നടത്താൻ
ഈ ഓപ്ഷനുകൾക്കായി GitHub UI ഒരു ഡ്രോപ്പ്ഡൗൺ മെനു കാണിക്കുന്നു. ഇത് ടൈപ്പിംഗ് തെറ്റുകൾ ഒഴിവാക്കാനും ഡീബഗ്ഗിംഗ് (debugging) എളുപ്പമാക്കാനും സഹായിക്കുന്നു.
സംഗ്രഹം (Summary)
ഈ പാറ്റേണുകൾ സങ്കീർണ്ണമല്ല, അവ വളരെ വ്യക്തമാണ്. ഈ നിയമങ്ങൾ രേഖപ്പെടുത്തി വെക്കാൻ എന്റെ റെപ്പോസിറ്ററിയിൽ (repository) ഞാൻ ഒരു ലളിതമായ മാർക്ക്ഡൗൺ ഫയൽ സൂക്ഷിക്കുന്നു. പുതിയ വർക്ക്ഫ്ലോകൾ ചേർക്കുമ്പോൾ സിസ്റ്റം തകരാറിലാകാതിരിക്കാൻ ഇത് സഹായിക്കുന്നു.
