𝗦𝗼𝗹𝘃𝗶𝗻𝗴 𝗣𝗮𝘆𝗺𝗲𝗻𝘁 𝗥𝗲𝗰𝗼𝗻𝗰𝗶𝗹𝗶𝗮𝘁𝗶𝗼𝗻 𝗘𝗿𝗿𝗼𝗿𝘀
ഒരു ക്ലയന്റിന് 2,000 ഡോളർ നഷ്ടപ്പെട്ടു. ആ വിടവ് കണ്ടെത്താൻ അവരുടെ ഫിനാൻസ് ലീഡ് നാല് രാത്രികൾ ചെലവഴിച്ചു.
പ്രശ്നം ഒരു retry job ആയിരുന്നു. സിസ്റ്റം 120 പേയ്മെന്റുകൾ രണ്ടുതവണ പ്രോസസ്സ് ചെയ്തു. ഇത് ഉപഭോക്താക്കളിൽ നിന്ന് വീണ്ടും പണം ഈടാക്കിയില്ല, പകരം ലെഡ്ജറിൽ (ledger) ഇരട്ടി റെക്കോർഡുകൾ മാത്രം ചേർത്തു.
ഞങ്ങൾ ഒരു idempotency layer ഉപയോഗിച്ച് ഇത് പരിഹരിച്ചു. ഒരു പേയ്മെന്റ് ഒരു തവണ മാത്രം പ്രോസസ്സ് ചെയ്യപ്പെടുന്നുണ്ടെന്ന് ഇത് ഉറപ്പാക്കുന്നു.
ഞങ്ങൾ ഇത് ചെയ്ത രീതി ഇതാ:
- ഡബിൾ റിക്വസ്റ്റുകൾ തടയാൻ ഞങ്ങൾ ഒരു Redis lock ഉപയോഗിച്ചു.
- ബാക്കപ്പ് ആയി ഡാറ്റാബേസിൽ ഒരു unique index ചേർത്തു.
- ഗേറ്റ്വേ പേരും transaction ID-യും ഉൾപ്പെടുത്തിയ ഒരു കീ ഞങ്ങൾ ഉപയോഗിച്ചു.
ഞങ്ങൾ എക്സ്ചേഞ്ച് നിരക്കുകളും (exchange rates) പരിഹരിച്ചു. സിസ്റ്റം ലൈവ് നിരക്കുകളാണ് ഉപയോഗിച്ചിരുന്നത്. നിരക്കുകൾ വേഗത്തിൽ മാറുന്നതിനാൽ ഇത് വിടവുകൾ ഉണ്ടാക്കി.
ഇപ്പോൾ ഓർഡർ തുടങ്ങുമ്പോൾ തന്നെ ഞങ്ങൾ നിരക്ക് ലോക്ക് ചെയ്യുന്നു. ഉപഭോക്താവ് കാണുന്ന വിലയും ഫിനാൻസ് ടീം കാണുന്ന വിലയും ഒന്നായിരിക്കും.
ഞങ്ങൾ ഒരു ഡെയ്ലി റിപ്പോർട്ടും നിർമ്മിച്ചു. ഇത് ബാങ്ക് CSV ഫയലുകളെ ഞങ്ങളുടെ റെക്കോർഡുകളുമായി താരതമ്യം ചെയ്യുന്നു. മാസത്തിലുണ്ടായിരുന്ന ജോലി 15 മണിക്കൂറിൽ നിന്ന് 2 മണിക്കൂറായി കുറഞ്ഞു.
എക്സൽ (Excel) ഉപയോഗിച്ചും രാത്രി വൈകിയും ജോലി ചെയ്യുന്നത് നിർത്തുക. പേയ്മെന്റ് പിശകുകൾ എന്നത് ഡിസൈൻ പ്രശ്നങ്ങളാണ്.
ഒരു database index-ലൂടെ തുടങ്ങുക. ബിസിനസ്സ് വളരുന്നതിനനുസരിച്ച് Redis locks ചേർക്കുക. ഒരു പേയ്മെന്റ് നോട്ടിഫിക്കേഷൻ ഒരു തവണ മാത്രമേ ലഭിക്കൂ എന്ന് ഒരിക്കലും കരുതരുത്.