તમારો ડેલ્ટા ફીડ મોડા કમિટ ચૂકી જાય છે: વિશ્વસનીય કર્સર બનાવો
એક પંક્તિ મોડી આવી કારણ કે વોટરમાર્ક કમિટની સીમા નહોતું. નિષ્ફળતા અનુસરો, પછી કવરેજ, સીમા, જાળવણી અને સુરક્ષિત ફરી-શરૂઆત વ્યાખ્યાયિત કરો.
અહીં એક નિષ્ફળતા છે જે મેં બે વાર જોઈ છે, બે અલગ એન્જિનમાં. એક એક્સપોર્ટ 10:00 વાગ્યે ચાલે છે અને જે સૌથી ઊંચો છેલ્લા-સુધારાનો સમયગુણ જોયો તે નોંધે છે. 09:58 વાગ્યે શરૂ થયેલો એક વ્યવહાર હજી ખુલ્લો છે, 10:03 વાગ્યે કમિટ થાય છે અને શરૂ થયાના સમયનો સમયગુણ ધરાવે છે. આગલો એક્સપોર્ટ ફક્ત 10:00 કરતાં નવી પંક્તિઓ માગે છે અને તેને ક્યારેય જોતો નથી. ટ્રાન્સફરનું કદ ઉત્તમ હતું અને માહિતી ખોટી હતી.
જે એક્સપોર્ટે એક પંક્તિ ગુમાવી તેને અનુસરો
SQL નહીં, ઘટનાઓનો ક્રમ અનુસરો. એપ્લિકેશન વ્યવહાર શરૂ થાય ત્યારે પંક્તિનો સુધારો-સમય લખે છે, કમિટ થાય ત્યારે નહીં. એક્સપોર્ટર દીવાલ-ઘડિયાળનું વોટરમાર્ક વાંચે છે જ્યારે તે વ્યવહાર હજી ખુલ્લો છે. પછી વ્યવહાર સાચવેલા વોટરમાર્ક કરતાં જૂનો સુધારો-સમય ધરાવીને કમિટ થાય છે. ગ્રાહકની આગલી બેચ વોટરમાર્ક પછી શરૂ થાય છે, તેથી પંક્તિ કર્સર પાછળ રહે છે અને ફરી ક્યારેય પસંદ નહીં થાય.
કંઈપણ ભૂલ નોંધતું નથી, કારણ કે કંઈ નિષ્ફળ ગયું નથી. એ જ આ વર્ગની બગને ખર્ચાળ બનાવે છે: ડેલ્ટા ફીડ ઝડપી છે, પંક્તિ-ગણતરી વિશ્વસનીય લાગે છે, અને ખૂટતી પંક્તિ અઠવાડિયા પછી સમાધાન-ટિકિટ તરીકે સપાટી પર આવે છે જે કોઈ ફરી બનાવી શકતું નથી.
ક્રમ-સંખ્યાઓમાં બીજા કારણસર એ જ પ્રકારનો દોષ છે. એકરસ ID તમને કહે છે કે મૂલ્યો કયા ક્રમમાં ફાળવાયા, વ્યવહારો કયા ક્રમમાં કમિટ થયા તે નહીં. નીચી સંખ્યા લીધેલો વ્યવહાર ઊંચી સંખ્યા લીધેલા પછી કમિટ થઈ શકે છે, તેથી ફાળવણી-ક્રમ આધારિત કર્સર પણ ખાડો છોડી શકે છે.
ફીડે આપવાના પાંચ વચન
પરિવહન પસંદ કરતાં પહેલાં સ્રોત સિસ્ટમ પાસેથી પાંચ કલમોનો કરાર માગો. કોઈ કલમ ખૂટે તો તમારી પાસે અનુમાન છે, પરિવર્તન-ફીડ નહીં.
- કવરેજ: ઉમેરા, સુધારા અને કાઢી નાખવા, દરેક સાથે લાગુ કરવા માટે જરૂરી સ્થિર કી.
- સીમા: કર્સર મૂલ્યનો અર્થ શું અને સુસંગત બેચમાં શું હોય છે.
- સુસંગતતા: અસંગત સ્રોત-સ્થિતિઓ ભેળવ્યા વિના સંબંધિત કોષ્ટકો કેવી રીતે વાંચવામાં આવે છે.
- જાળવણી: ડિસ્કનેક્ટ થયેલો ગ્રાહક તેની સાચવેલી સ્થિતિથી કેટલા સમય સુધી ફરી શરૂ કરી શકે.
- ફરી-શરૂઆત: તે સ્થિતિ હવે માન્ય ન હોય ત્યારે સમર્થિત સંપૂર્ણ સ્નેપશોટ.
સમર્થિત મિકેનિઝમ પાંચેય પૂરા કરી શકે. SQL Server નું પરિવર્તન-ટ્રેકિંગ દસ્તાવેજીકરણ એક ચોક્કસ પ્રકાશિત ઉદાહરણ છે: તે લઘુત્તમ માન્ય આવૃત્તિ વ્યાખ્યાયિત કરે છે, પરિવર્તનો સાથે કાઢી નાખવા પણ નોંધે છે, અને સ્નેપશોટ વ્યવહારનું વર્ણન કરે છે જે માન્યતા, આવૃત્તિ-કબજો અને સંબંધિત પરિવર્તન-પ્રશ્નોને આવરે છે. તે સ્રોત પાસેથી શું માગવું તેનું ઉદાહરણ છે, બીજા એન્જિનમાં પેસ્ટ કરવાની સિન્ટેક્સ નહીં.
ચેકપોઇન્ટને પાઇપલાઇનના ભાગ તરીકે ડિઝાઇન કરો
ગ્રાહકની સાચવેલી સ્થિતિ એ ખરી સ્ટેટ મશીન છે, તેથી તેને એ રીતે લખો. કર્સર ફક્ત તે જ વર્કફ્લો દ્વારા આગળ વધી શકે જે બેચ પહેલેથી લાગુ કરી ચૂક્યું છે અને લક્ષ્ય વ્યવહાર કમિટ કરી ચૂક્યું છે.
cursor = durable_checkpoint() # last fully applied position
batch = extract(cursor, upper_bound) # one consistent batch
apply(batch) # idempotent at the target
commit()
checkpoint(batch.upper_bound) # only now
જો ડિલિવરી અડધે રસ્તે નિષ્ફળ જાય, તો નવી સ્રોત-સ્થિતિ શોધવાને બદલે એ જ બેચનું સમાધાન કરો. વધુ તાજા ઉપલા બંધ સાથે ફરી નિષ્કર્ષણ કરવું એ જ રીત છે જેમાં આંશિક લાગુકરણ કાયમી ખાલીપો બને છે. અરીસા-નિયમ બીજી બાજુ પણ લાગુ પડે છે: લક્ષ્ય પર ઇડેમ્પોટેન્ટ લાગુકરણ નકલો અટકાવે છે અને નિષ્કર્ષણે ક્યારેય ન જોયેલા પરિવર્તન માટે કંઈ કરતું નથી.
કાઢી નાખવા માટે નિષ્કર્ષ નહીં, નોંધ જરૂરી
હજી અસ્તિત્વમાં રહેલી પંક્તિઓ સરખાવીને ગ્રાહકને કહી શકાય નહીં કે કઈ કી અદૃશ્ય થઈ. જે સ્રોત કદી કાઢી નાખવા નોંધતું નથી તે તમને બે અપૂર્ણ વિકલ્પો આપે છે: તફાવત માટે પૂરતી લાંબી કી-ઇતિહાસ રાખવી, અથવા સમયપત્રક મુજબ સ્પષ્ટ સંપૂર્ણ સમાધાન ચલાવવું. બંને ખર્ચ સાથેના ડિઝાઇન નિર્ણયો છે, અને કોઈ માલિક ન હોય તો એક પણ અસ્તિત્વમાં નથી.
જાળવણી એ જ પ્રકારનો નિર્ણય છે. દરેક સમર્થિત પરિવર્તન-ફીડની એક વિન્ડો હોય છે; તેને કરારમાં જણાવો અને ગ્રાહકનું ચેકપોઇન્ટ તેની નજીક આવે ત્યારે ચેતવણી આપો. બે અઠવાડિયાના વિરામ પછી જાગતા ગ્રાહકે શાંતિથી આંશિક બેચ મેળવવાને બદલે સ્પષ્ટ "ફરી-શરૂઆત જરૂરી" ભૂલ વાંચવી જોઈએ.
પછી માપો કે ડેલ્ટા યોગ્ય હતો કે નહીં
દરેક કી અને હેશ સરખાવવા તરફ પાછા ફરવું ક્યારેક યોગ્ય છે, અને તેનો ખર્ચ જાણવો જોઈએ. તમે હજી દરેક પંક્તિની માહિતી ટ્રાન્સફર કરો છો, હેશ કોષ્ટકો વચ્ચે સુસંગત સ્નેપશોટ આપતા નથી, અને હેશ-સ્કીમ રજૂઆત અને ટક્કરો વિશે પોતાના પ્રશ્નો લાવે છે. ચકાસી શકાય તેવી સીમા સાથે ઓછા બાઇટ એ લક્ષ્ય છે; શાંતિથી કમિટ થયેલું પરિવર્તન છોડી દેતા ઓછા બાઇટ ડેલ્ટા જ નથી.
છેલ્લા-સુધારાનો કૉલમ એક સંકેત છે. જે કર્સર મોડી કમિટ, કાઢી નાખવા અને લાંબા વિરામમાંથી પસાર થાય છે તે કરાર છે.