പല Node.js ട്യൂട്ടോറിയലുകളും എറർ ഹാൻഡ്‌ലിംഗിനെ (error handling) ഒരു രണ്ടാംകിട കാര്യമായിട്ടാണ് കാണുന്നത്. നിങ്ങൾ ഒരു റൂട്ട് ഹാൻഡ്‌ലറിനെ try/catch ബ്ലോക്കിനുള്ളിലാക്കുന്നു, സ്റ്റാക്ക് ട്രാസ് (stack trace) ലോഗ് ചെയ്യുന്നു, എന്നിട്ട് ഒരു 500 എറർ റിട്ടേൺ ചെയ്യുന്നു. ഒരു HTTP റിക്വസ്റ്റിന്റെ അപ്പുറത്ത് ഒരു വ്യക്തി കാത്തിരിക്കുന്നുണ്ടെന്നതുകൊണ്ടാണ് ഈ രീതി നിലനിൽക്കുന്നത്. ബാക്ക്ഗ്രൗണ്ട് ജോബുകൾ (Background jobs) വ്യത്യസ്തമാണ്. ഒരു ക്യൂ സിസ്റ്റത്തിൽ (queue system), മറുപടി നൽകാൻ കാത്തിരിക്കുന്ന ഒരു ക്ലയന്റോ ഓട്ടോമാറ്റിക് ബ്രൗസർ റിഫ്രഷോ ഇല്ല. അവിടെ ഒരു വർക്കറും (worker), ഒരു പേലോഡും (payload), നിശബ്ദമായി വർദ്ധിച്ചുകൊണ്ടിരിക്കുന്ന ഒരു റീട്രൈ കൗണ്ടറും (retry counter) മാത്രമേയുള്ളൂ. കാര്യങ്ങൾ തെറ്റായിപ്പോകുമ്പോൾ, അവ ആദ്യം പതുക്കെയും പിന്നീട് പെട്ടെന്ന് എല്ലാം ഒരുമിച്ച് സംഭവിക്കുകയും ചെയ്യുന്നു. ഒരു തെറ്റായ എറർ ക്ലാസിഫിക്കേഷൻ മുഴുവൻ പൈപ്പ്‌ലൈനിനെയും തടസ്സപ്പെടുത്തുകയോ അല്ലെങ്കിൽ പുലർച്ചെ മൂന്ന് മണിക്ക് ഒരു എഞ്ചിനീയറെ വിളിച്ചുണർത്തുകയോ ചെയ്തേക്കാം.

ഇതിലെ വ്യത്യാസം ലളിതമാണ്. റിക്വസ്റ്റ്-റെസ്പോൺസ് സൈക്കിളുകൾ (Request-response cycles) വേഗത്തിൽ പരാജയപ്പെടുകയും അത് പെട്ടെന്ന് തിരിച്ചറിയാൻ കഴിയുകയും ചെയ്യുന്നു. എന്നാൽ ഒരു ക്യൂ പരാജയപ്പെടുന്നത് നിശബ്ദമായിരിക്കും. ഒരു ഡാറ്റാബേസ് കണക്ഷൻ നഷ്ടപ്പെടുന്നതിന് മുമ്പ് ഒരു വർക്കർ നൂറുകണക്കിന് ജോലികൾ ചെയ്തേക്കാം. വ്യക്തമായ ഹാൻഡ്‌ലിംഗ് നിയമങ്ങൾ ഇല്ലെങ്കിൽ, വർക്കർ ഉടൻ തന്നെ വീണ്ടും ശ്രമിക്കുകയും (retry), നിലവിൽ ബുദ്ധിമുട്ടുന്ന ഡാറ്റാബേസിനെ കൂടുതൽ സമ്മർദ്ദത്തിലാക്കുകയും, ഒടുവിൽ ക്രാഷ് ആകുകയും ചെയ്യും. ആരും വർക്കറെ നേരിട്ട് നിരീക്ഷിക്കാത്തതിനാൽ, പ്രശ്നത്തിന്റെ ആദ്യ സൂചന പലപ്പോഴും ലോഗ് ഫയലുകൾ നിറയുന്നതോ അല്ലെങ്കിൽ ബാക്കപ്പ് വർദ്ധിക്കുന്നതോ ആയിരിക്കും. നിങ്ങൾക്ക് വെറും catch ബ്ലോക്കുകൾ മാത്രം പോരാ. വ്യത്യസ്ത പരാജയങ്ങളെ വ്യത്യസ്തമായി കൈകാര്യം ചെയ്യാനും ഒരു മോശം ജോബ് കാരണം ബാക്കി സിസ്റ്റത്തെ സംരക്ഷിക്കാനും കഴിയുന്ന ഒരു സ്ട്രാറ്റജി ആവശ്യമാണ്.

രണ്ട് തരം പരാജയങ്ങൾ

എല്ലാ എററുകളെയും രണ്ട് വിഭാഗങ്ങളായി തിരിച്ച് തുടങ്ങുക.

റീട്രൈ ചെയ്യാവുന്ന (Retryable) എററുകൾ താൽക്കാലികമാണ്. ഒരു തേർഡ് പാർട്ടി API-യിലേക്കുള്ള നെറ്റ്‌വർക്ക് ടൈംഔട്ട്, ഒരു 429 റേറ്റ്-ലിമിറ്റ് റെസ്പോൺസ്, അല്ലെങ്കിൽ പ്രൈമറി ഡാറ്റാബേസിനേക്കാൾ പിന്നിലായുള്ള ഒരു ടെമ്പററി ഡാറ്റാബേസ് റെപ്ലിക്ക എന്നിവ ഇതിന് ഉദാഹരണമാണ്. ഇവ സമ്മർദ്ദത്തിന്റെ ലക്ഷണങ്ങൾ മാത്രമാണ്, ബഗുകളല്ല. മുപ്പത് സെക്കൻഡിനുള്ളിൽ സിസ്റ്റം സ്വയം ശരിയാക്കിയേക്കാം. റീട്രൈ ചെയ്യാവുന്ന ജോലികൾക്ക് നിയന്ത്രിത സാഹചര്യങ്ങളിൽ വീണ്ടും ശ്രമിക്കാവുന്നതാണ്.

പെർമനന്റ് (Permanent) എററുകൾ പിശകുകളാണ്. പേലോഡിലെ തെറ്റായ JSON, ഒരു മിസ്സിംഗ് യൂസർ ഐഡി, സ്റ്റോറേജിൽ ഇല്ലാത്ത ഒരു ഫയൽ എന്നിവ ഇതിൽ ഉൾപ്പെടുന്നു. ഇവ ആദ്യ ശ്രമത്തിൽ പരാജയപ്പെട്ടതുപോലെ തന്നെ നൂറാം ശ്രമത്തിലും പരാജയപ്പെടും. ഇവ വീണ്ടും ശ്രമിക്കുന്നത് CPU സൈക്കിളുകൾ പാഴാക്കുകയും, ക്യൂ സ്ലോട്ടുകൾ നഷ്ടപ്പെടുത്തുകയും, ആരോഗ്യകരമായ ജോലികളെ വൈകിപ്പിക്കുന്ന ടോക്സിക് ബാക്ക്-പ്രഷർ (toxic back-pressure) സൃഷ്ടിക്കുകയും ചെയ്യും. ഒരു പെർമനന്റ് പരാജയത്തിന് ഏറ്റവും അനുയോജ്യമായ സ്ഥലം ഒരു ലോഗ്, ഒരു അലേർട്ട് അല്ലെങ്കിൽ ഒരു ഡെഡ്-ലെറ്റർ ക്യൂ (dead-letter queue) എന്നിവയാണ്. അവ റീട്രൈ ലൂപ്പിൽ ഉൾപ്പെടുത്തരുത്.

ഒരു ഡിസിഷൻ എഞ്ചിൻ നിർമ്മിക്കുക

ഉടനടി തരംതിരിക്കുക. ഈ തീരുമാനം ക്യൂ ഫ്രെയിംവർക്കിന് വിട്ടുകൊടുക്കരുത്. ഒരു എറർ ലഭിച്ച നിമിഷം തന്നെ അതിന്റെ വിധി തീരുമാനിക്കുക.

പ്രായോഗികമായി പറഞ്ഞാൽ, ഒരു എറർ റിപ്പോർട്ട് ചെയ്യുന്നതിന് മുമ്പ് അത് പരിശോധിക്കുന്ന കസ്റ്റം എറർ ക്ലാസുകളോ (custom error classes) റാപ്പർ ഫംഗ്ഷനുകളോ (wrapper functions) നിർമ്മിക്കുക എന്നാണ് ഇതിനർത്ഥം. ഒരു ഡാറ്റാബേസ് ഡ്രൈവർ കണക്ഷൻ റീസെറ്റ് (connection reset) കാണിച്ചാൽ, നിങ്ങളുടെ ഹാൻഡ്‌ലർ അതിനെ റീട്രൈ ചെയ്യാവുന്ന ഒന്നായി അടയാളപ്പെടുത്തണം. ഒരു പേലോഡ് വാലിഡേറ്റർ സ്കീമ മിസ്മാച്ച് (schema mismatch) കാണിച്ചാൽ, അതിനെ പെർമനന്റ് ആയി അടയാളപ്പെടുത്തണം. മിക്ക ജോബ് പ്രോസസറുകളും എല്ലാം റീട്രൈ ചെയ്യാൻ ശ്രമിക്കുന്നു, ഇത് ഏറ്റവും വലിയ നഷ്ടമുണ്ടാക്കുന്ന തീരുമാനമാണ്. പെർമനന്റ് ജോലികൾ ഉടൻ തന്നെ നിരസിക്കുക. അവ ഒഴിവാക്കുകയോ അല്ലെങ്കിൽ മെയിൻ പൈപ്പ്‌ലൈനിനെ ബാധിക്കാത്ത രീതിയിൽ ഒരു ഡെഡ്-ലെറ്റർ ക്യൂവിലേക്ക് മാറ്റുകയോ ചെയ്യുക. ഈ ഒരു ശീലം ഇൻഫ്രാസ്ട്രക്ചർ മാറ്റങ്ങളേക്കാൾ മികച്ച രീതിയിൽ പ്രശ്നങ്ങൾ വഷളാകുന്നത് തടയും.

പിൻവാങ്ങുക, എന്നാൽ ബുദ്ധിപൂർവ്വം

റീട്രൈ ചെയ്യുമ്പോൾ ഒരിക്കലും അത് ഉടൻ തന്നെ ചെയ്യരുത്. ഒരു ഡാറ്റാബേസ് പ്രവർത്തനരഹിതമാണെങ്കിൽ, ഓരോ സെക്കൻഡിലും വർക്കർമാർ അതിനെ ആക്രമിക്കുന്നത് ഒരു ഡിനയൽ-ഓഫ്-സർവീസ് (denial-of-service) ആക്രമണം പോലെ തോന്നും. എക്സ്പോണൻഷ്യൽ ബാക്കോഫ് (exponential backoff) ഉപയോഗിക്കുക. ഒരു മിനിറ്റ് കാത്തിരിക്കുക, പിന്നെ അഞ്ച്, പിന്നെ പതിനഞ്ച്. അപ്പപ്പോൾ തന്നെ ശ്രമിക്കാതെ സിസ്റ്റത്തിന് വീണ്ടെടുക്കാൻ സമയം നൽകുക.

എന്നാൽ എക്സ്പോണൻഷ്യൽ ബാക്കോഫ് മാത്രം മതിയാകില്ല. ഒരു സർവീസ് റീസ്റ്റാർട്ട് ചെയ്തതുകൊണ്ട് ആയിരം ജോലികൾ ഒരേസമയം പരാജയപ്പെട്ടാൽ, അവയുടെ റീട്രൈ ഷെഡ്യൂളുകൾ ഒരേപോലെയായിരിക്കും. സർവീസ് ഓൺലൈൻ വരുമ്പോൾ അവ ഒരേസമയം ആ സർവീസിനെ ആക്രമിക്കുകയും വീണ്ടും തകരാറിലാക്കുകയും ചെയ്തേക്കാം. ഇതിനായി ജിറ്റർ (jitter) ചേർക്കുക: ഓരോ ഡിലേയ്ക്കും ചെറിയൊരു റാൻഡം ഓഫ്‌സെറ്റ് (random offset) നൽകുക. റീട്രൈകൾ കുറച്ച് സെക്കൻഡുകൾക്കിടയിൽ വിന്യസിക്കുന്നത് ഒരേസമയം വലിയ തോതിൽ പരാജയങ്ങൾ സംഭവിക്കുന്നത് തടയും. ഇതിന്റെ കണക്ക് ലളിതമാണെങ്കിലും ഇത് നൽകുന്ന സ്ഥിരത വളരെ വലുതാണ്.

തെളിവുകൾ സൂക്ഷിക്കുക

ഒരു ഡെഡ്-ലെറ്റർ ക്യൂ (dead-letter queue) എന്നത് നിങ്ങളുടെ ഓഡിറ്റ് ട്രയൽ ആണ്, അല്ലാതെ ഒരു ചവറ്റുകുട്ടയല്ല. ഒരു ജോലിയുടെ റീട്രൈ പരിധി കഴിഞ്ഞാൽ അത് വെറുതെ ഡിലീറ്റ് ചെയ്യരുത്. മുഴുവൻ പേലോഡും എറർ കോൺടെക്സ്റ്റും (error context) റീട്രൈ ഹിസ്റ്ററിയും സഹിതം ഒരു DLQ-ലേക്ക് മാറ്റുക.

ഇത് തെളിവുകൾ നിലനിർത്തുന്നു. ഒരു മനുഷ്യന് ആ ജോലി പരിശോധിക്കാനും ബഗ് പരിഹരിക്കാനും ആവശ്യമെങ്കിൽ അത് മാനുവലായി വീണ്ടും പ്രവർത്തിപ്പിക്കാനും സാധിക്കും. അതിലുപരി, നിങ്ങളുടെ DLQ-യുടെ ആഴം (depth) നിരീക്ഷിക്കുക. ഡെഡ്-ലെറ്റർ ജോലികളുടെ പെട്ടെന്നുള്ള വർദ്ധനവ് ഒരു മോശം ഡിപ്ലോയ്മെന്റിന്റെയോ, തെറ്റായ സ്കീമ മാറ്റത്തിന്റെയോ അല്ലെങ്കിൽ ഒരു എക്സ്റ്റേണൽ വെണ്ടർ കരാർ ലംഘിച്ചതിന്റെയോ ആദ്യ സൂചനയാകാം. DLQ വർദ്ധനവിനെ ഒരു മുന്നറിയിപ്പായി കാണുക. നിങ്ങളുടെ DLQ നിറയുന്നുണ്ടെങ്കിൽ, സിസ്റ്റത്തിൽ എവിടെയോ മാറ്റം വന്നിട്ടുണ്ട്, അത് വലിയൊരു പ്രശ്നമായി മാറുന്നതിന് മുമ്പ് നിങ്ങളുടെ ടീം അറിയേണ്ടതുണ്ട്.

റീട്രൈയ്ക്കായി രൂപകൽപ്പന ചെയ്യുക

ഓരോ ജോബും രണ്ട് തവണ പ്രവർത്തിക്കും എന്ന രീതിയിൽ രൂപകൽപ്പന ചെയ്യുക, കാരണം അത് സംഭവിക്കാനുള്ള സാധ്യതയുണ്ട്. ഒരു വർക്കർ പ്രോസസ്സിംഗിനിടെ പകുതിയിൽ വെച്ച് പരാജയപ്പെടാനും, വീണ്ടും ഷെഡ്യൂൾ ചെയ്യപ്പെടാനും, ഒന്നുകൂടി പ്രവർത്തിക്കാനും സാധ്യതയുണ്ട്. നിങ്ങളുടെ ജോബ് ഒരു ഉപഭോക്താവിൽ നിന്ന് പണം ഈടാക്കുകയോ, ഒരു ഇമെയിൽ അയക്കുകയോ, അല്ലെങ്കിൽ ഇൻവെന്ററി കൗണ്ട് വർദ്ധിപ്പിക്കുകയോ ചെയ്യുന്നതാണെങ്കിൽ, ലളിതമായ ഒരു റീട്രൈ (retry) ഡ്യൂപ്ലിക്കേറ്റുകൾ ഉണ്ടാക്കാൻ കാരണമാകും.

ഇതിനുള്ള പരിഹാരം ഐഡംപോറ്റൻസി (idempotency) ആണ്. ഒരു സൈഡ് ഇഫക്റ്റ് നടത്തുന്നതിന് മുമ്പ്, അത് ഇതിനകം സംഭവിച്ചിട്ടുണ്ടോ എന്ന് പരിശോധിക്കുക. ജോബ് പേലോഡിൽ നിന്നുള്ള ഒരു യൂണിക് ഐഡന്റിഫയർ ഐഡംപോറ്റൻസി കീയായി ഉപയോഗിക്കുക. ആ കീ ഒരു ഷോർട്ട്-ലിവിംഗ് കാഷെയിലോ (short-lived cache) അല്ലെങ്കിൽ യൂണിക്നെസ്സ് കൺസ്ട്രയിന്റ് ഉള്ള ഒരു ഡാറ്റാബേസ് ടേബിളിലോ സൂക്ഷിക്കുക. കീ നിലവിലുണ്ടെങ്കിൽ, ആ ജോലി ഒഴിവാക്കി വിജയം (success) അറിയിക്കുക. ഇത് റീട്രൈകളെ ഒരു അപകടസാധ്യതയിൽ നിന്ന് ദോഷകരമല്ലാത്ത ഒരു 'no-op' ആക്കി മാറ്റുന്നു. ഇതിനായി കുറച്ച് അധികം കോഡ് വരികൾ ആവശ്യമായി വന്നേക്കാം, പക്ഷേ രാത്രിയോടെ വരുമാനം ഇരട്ടിയായതെന്തുകൊണ്ട് എന്ന് ഫിനാൻസ് വിഭാഗത്തിന് വിശദീകരിച്ചു കൊടുക്കുന്നതിൽ നിന്ന് ഇത് നിങ്ങളെ രക്ഷിക്കും.

പ്രോസസ്സിനെ സംരക്ഷിക്കുക

അൺബൗണ്ടഡ് പ്രോമിസ് റിജക്ഷനുകളും (unbounded promise rejections) അപ്രതീക്ഷിത എക്സെപ്ഷനുകളും (stray exceptions) മുന്നറിയിപ്പില്ലാതെ ഒരു Node.js പ്രോസസ്സിനെ തകരാറിലാക്കാം. ഒരു വർക്കറുടെ കാര്യത്തിൽ, ഇതിനർത്ഥം ജോബുകൾ നഷ്ടപ്പെടുകയും ഒരു ഓർക്കസ്ട്രേറ്റർ കണ്ടെയ്നർ വീണ്ടും റീസ്റ്റാർട്ട് ചെയ്യാൻ പാടുപെടുകയും ചെയ്യും എന്നാണ്.

unhandledRejection, uncaughtException എന്നിവയ്ക്കായി ഗ്ലോബൽ ഹാൻഡ്‌ലറുകൾ രജിസ്റ്റർ ചെയ്യുക. ആപ്ലിക്കേഷനെ രക്ഷിക്കുക എന്നതല്ല അവയുടെ ജോലി. ആവശ്യമായ കുറഞ്ഞ അളവിലുള്ള ക്ലീനപ്പ് (cleanup) നടത്തി പുറത്തുകടക്കുക എന്നതാണ് അവയുടെ ലക്ഷ്യം. Docker, Kubernetes അല്ലെങ്കിൽ systemd എന്നിവയെ വർക്കറിനെ ഒരു ക്ലീൻ മെമ്മറി സ്റ്റേറ്റോടെ റീസ്റ്റാർട്ട് ചെയ്യാൻ അനുവദിക്കുക. ഒരു ഗ്ലോബൽ ഹാൻഡ്‌ലർ പ്രവർത്തിച്ചതിന് ശേഷം തകരാറുകളോടെ മുന്നോട്ട് പോകുന്നത് മെമ്മറി ലീക്കുകൾക്കും (memory leaks) ഡാറ്റാ കോറപ്ഷനും കാരണമാകും. ജോബുകൾ തെറ്റായി പ്രോസസ്സ് ചെയ്യുന്ന ഒരു സാവധാനത്തിലുള്ള 'സോംബി പ്രോസസ്സിനേക്കാൾ' (zombie process) വേഗത്തിലുള്ളതും വൃത്തിയുള്ളതുമായ ഒരു നിർത്തലാക്കലാണ് സുരക്ഷിതം. നിങ്ങളെ വീണ്ടും പ്രവർത്തനക്ഷമമാക്കാൻ നിങ്ങളുടെ ഓർക്കസ്ട്രേറ്ററെ വിശ്വസിക്കുക; തകരാറിലായ ഒരു റൺടൈമിനെ (runtime) മറികടക്കാൻ ശ്രമിക്കരുത്.

സിഗ്നലുകളെ മാനിക്കുക

ഡിപ്ലോയ്‌മെന്റുകൾ, സ്കെയിലിംഗ് ഇവന്റുകൾ, നോഡ് റൊട്ടേഷനുകൾ എന്നിവയ്ക്കിടെ വർക്കറുകൾ ഷട്ട്ഡൗൺ ചെയ്യപ്പെടാറുണ്ട്. നിങ്ങളുടെ പ്രോസസ്സിന് SIGTERM ലഭിച്ച നിമിഷം തന്നെ അത് നിലയ്ക്കുകയാണെങ്കിൽ, നിലവിൽ നടന്നുകൊണ്ടിരിക്കുന്ന ജോബ് നിങ്ങൾ പാതിവഴിയിൽ ഉപേക്ഷിക്കുകയാണ് ചെയ്യുന്നത്. ആ ജോലി ഒരിക്കലും പൂർത്തിയാകില്ലെന്നും അതിന്റെ റീട്രൈ കൗണ്ടർ (retry counter) വർദ്ധിച്ചിട്ടുണ്ടാകില്ലെന്നും വരാം.

SIGTERM, SIGINT എന്നിവ ശ്രദ്ധിക്കുക. ഒരു സിഗ്നൽ ലഭിക്കുമ്പോൾ, ക്യൂവിൽ നിന്ന് പുതിയ ജോബുകൾ എടുക്കുന്നത് നിർത്തുക. സാധിക്കുമെങ്കിൽ നിലവിലുള്ള ജോലി പൂർത്തിയാക്കുക. ഒരു നിശ്ചിത സമയപരിധി (ഉദാഹരണത്തിന് മുപ്പത് സെക്കൻഡ്) നിശ്ചയിക്കുക, അതിനുശേഷം എന്തുതന്നെയായാലും പുറത്തുകടക്കുക. ഈ 'ഗ്രേസ്ഫുൾ ഷട്ട്ഡൗൺ' (graceful shutdown) ക്യൂവിനെ മാനിക്കുകയും തെറ്റായ പരാജയങ്ങൾ ഒഴിവാക്കുകയും ചെയ്യുന്നു. വൃത്തിയായി പുറത്തുകടക്കുന്ന ഒരു വർക്കറിനെ നിങ്ങളുടെ ഡിപ്ലോയ്‌മെന്റ് പൈപ്പ്‌ലൈൻ ആരോഗ്യകരമായി (healthy) കണക്കാക്കണം, എന്നാൽ തകരാറിലായ (crashed) ഒരു വർക്കർ അലേർട്ട് നൽകണം.

യഥാർത്ഥ പാഠം

വിശ്വസനീയമായ ക്യൂ ഹാൻഡ്‌ലിംഗ് എന്നാൽ എല്ലാ പിശകുകളും പിടികൂടുക എന്നതല്ല. ഓരോ പരാജയ രീതിക്കും (failure mode) കൃത്യമായ തീരുമാനങ്ങൾ എടുക്കുക എന്നതാണ് പ്രധാനം. താൽക്കാലികമായ പിശകുകൾ (transient errors) ക്ഷമയോടെ റീട്രൈ ചെയ്യുക. സ്ഥിരമായ പിശകുകൾ വേഗത്തിൽ പരിഹരിക്കുക. അമിതമായ തിരക്കുകളിൽ (stampedes) നിന്ന് നിങ്ങളുടെ വർക്കറുകളെ സംരക്ഷിക്കുക, ഐഡംപോറ്റൻസി കീകൾ ഉപയോഗിച്ച് നിങ്ങളുടെ ഡാറ്റ സുരക്ഷിതമാക്കുക, തകരാറിലായ പ്രോസസ്സുകളെ വൃത്തിയായി പുറത്തുകടക്കാൻ അനുവദിക്കുക. ഓരോ പരാജയത്തിനും കൃത്യമായ ഒരു പാതയുണ്ടെങ്കിൽ, പുലർച്ചെ മൂന്ന് മണി എന്നത് വെറുമൊരു സാധാരണ മണിക്കൂർ മാത്രമായി മാറും. നിങ്ങളുടെ പൈപ്പ്‌ലൈൻ മുന്നോട്ട് നീങ്ങിക്കൊണ്ടിരിക്കും, നിങ്ങളുടെ ടീമിന് സമാധാനമായി ഉറങ്ങാനും സാധിക്കും.