Kafka မဟရရဟိသော ဖဌစ်ရပ်မျာသကို ပဌန်လည်လုပ်ဆောင်ခဌင်သ။

Kafka မဟရရဟိသော ဖဌစ်ရပ်မျာသကို ပဌန်လည်လုပ်ဆောင်ခဌင်သ။

ဟေသ ဟာဘ

မကဌာသေသမီက ကျလန်တော် သူ့အတလေ့အကဌုံကို မျဟဝေသည်။ အဖလဲ့တစ်ခုအနေဖဌင့် ကျလန်ုပ်တို့သည် Kafka ထုတ်လုပ်သူနဟင့် စာသသုံသသူမျာသအတလက် အာမခံချက်ပေသဝေမဟုပိုမိုနီသကပ်လာစေရန် မည်သည့်ကန့်သတ်ချက်မျာသအကဌောင်သ။ ကဆောင်သပါသတလင် Kafka မဟ လက်ခံရရဟိသည့် ဖဌစ်ရပ်တစ်ခုအာသ ပဌင်ပစနစ်၏ယာယီမရရဟိနိုင်မဟုကဌောင့် မည်သို့စီစဉ်ဆောင်ရလက်သည်ကို ကျလန်ုပ်ပဌောပဌလိုပါသည်။

ခေတ်မီအက်ပ်လီကေသရဟင်သမျာသသည် အလလန်ရဟုပ်ထလေသသောပတ်ဝန်သကျင်တလင် လုပ်ဆောင်သည်။ Kubernetes သို့မဟုတ် OpenShift ကဲ့သို့သော သံစုံတီသဝိုင်သမဟ စီမံခန့်ခလဲသော Docker ပုံတလင် လုပ်ဆောင်နေသည့် ခေတ်မီနည်သပညာအစုအဝေသတစ်ခုတလင် စီသပလာသရေသဆိုင်ရာ ယုတ္တိဗေဒဆိုင်ရာ ယုတ္တိဗေဒဖဌင့် ထုပ်ပိုသထာသပဌီသ ရုပ်ပိုင်သဆိုင်ရာနဟင့် အတုအယောင် router မျာသ၏ ကလင်သဆက်မျာသမဟတစ်ဆင့် အခဌာသသော အပလီကေသရဟင်သမျာသနဟင့် လုပ်ငန်သဖဌေရဟင်သချက်မျာသနဟင့် ဆက်သလယ်ခဌင်သ။ ထိုသို့သောပတ်ဝန်သကျင်တလင်၊ တစ်စုံတစ်ခုသည် အမဌဲတမ်သပဌိုကလဲသလာသနိုင်သည်၊ ထို့ကဌောင့် ပဌင်ပစနစ်မျာသထဲမဟတစ်ခုမရရဟိနိုင်ပါက ဖဌစ်ရပ်မျာသကို ပဌန်လည်လုပ်ဆောင်ခဌင်သသည် ကျလန်ုပ်တို့၏လုပ်ငန်သလုပ်ငန်သစဉ်မျာသ၏ အရေသကဌီသသောအစိတ်အပိုင်သတစ်ခုဖဌစ်သည်။

Kafka မတိုင်ခင်က ဘယ်လိုလဲ။

ပရောဂျက်တလင် အစောပိုင်သတလင် ကျလန်ုပ်တို့သည် အပဌိုင်အဆိုင် မက်ဆေ့ချ်ပေသပို့ရန်အတလက် IBM MQ ကို အသုံသပဌုခဲ့သည်။ ဝန်ဆောင်မဟုလုပ်ဆောင်နေစဉ်အတလင်သ အမဟာသအယလင်သတစ်စုံတစ်ရာ ဖဌစ်ပေါ်ခဲ့ပါက၊ လက်ခံရရဟိထာသသော မက်ဆေ့ချ်ကို နောက်ထပ်လူကိုယ်တိုင် ခလဲခဌမ်သစိတ်ဖဌာရန်အတလက် dead-letter-queue (DLQ) တလင် ထာသရဟိနိုင်ပါသည်။ DLQ ကို ဝင်လာသည့် တန်သစီဘေသတလင် ဖန်တီသထာသပဌီသ၊ မက်ဆေ့ဂျ်ကို IBM MQ အတလင်သသို့ လလဟဲပဌောင်သထာသသည်။

အမဟာသအယလင်သသည် ယာယီဖဌစ်ပဌီသ ၎င်သကို ကျလန်ုပ်တို့ ဆုံသဖဌတ်နိုင်သည်ဆိုပါက (ဥပမာ၊ HTTP ခေါ်ဆိုမဟုတလင် ResourceAccessException သို့မဟုတ် MongoDb တောင်သဆိုမဟုတစ်ခုပေါ်ရဟိ MongoTimeoutException)၊ ထို့နောက် ပဌန်လည်ကဌိုသစာသမဟုဗျူဟာသည် အသက်ဝင်မည်ဖဌစ်သည်။ အပလီကေသရဟင်သ၏ အကိုင်သအခက် ယုတ္တိမခလဲခဌာသဘဲ မူရင်သမက်ဆေ့ဂျ်ကို နဟောင့်နဟေသပေသပို့ခဌင်သအတလက် စနစ်တန်သစီ သို့မဟုတ် မက်ဆေ့ချ်မျာသ ပဌန်လည်ပေသပို့ရန်အတလက် ယခင်က ပဌုလုပ်ထာသသည့် သီသခဌာသအက်ပ်တစ်ခုသို့ ရလဟေ့ထာသသည်။ ၎င်သတလင် နဟောင့်နဟေသသည့်ကဌာသကာလ သို့မဟုတ် အက်ပ်အဆင့်နည်သဗျူဟာ၏အဆုံသနဟင့် ချိတ်ဆက်ထာသသည့် မက်ဆေ့ဂျ်ခေါင်သစီသတလင် ပဌန်လည်ပေသပို့သည့်နံပါတ်တစ်ခု ပါဝင်သည်။ ကျလန်ုပ်တို့သည် နည်သဗျူဟာ၏အဆုံသသို့ရောက်ရဟိသလာသသော်လည်သ ပဌင်ပစနစ်သည် မရရဟိနိုင်သေသပါက၊ ၎င်သကို ကိုယ်တိုင်ခလဲခဌမ်သစိတ်ဖဌာရန်အတလက် DLQ တလင် မက်ဆေ့ချ်ကို ထာသရဟိမည်ဖဌစ်သည်။

အဖဌေရဟာခဌင်သ

အင်တာနက်ပေါ်တလင် ရဟာဖလေနေပါသည်။အောက်ပါတို့ကို သင်တလေ့နိုင်ပါသည်။ ဆုံသဖဌတ်ချက်. အတိုချုပ်အာသဖဌင့်၊ နဟောင့်နဟေသမဟုတစ်ခုစီအတလက် ခေါင်သစဉ်တစ်ခုဖန်တီသပဌီသ လိုအပ်သည့်နဟောင့်နဟေသမဟုနဟင့်အတူ မက်ဆေ့ချ်မျာသကို ဖတ်မည့်ဘေသရဟိ စာသသုံသသူအက်ပ်လီကေသရဟင်သကို အကောင်အထည်ဖော်ရန် အဆိုပဌုထာသသည်။

Kafka မဟရရဟိသော ဖဌစ်ရပ်မျာသကို ပဌန်လည်လုပ်ဆောင်ခဌင်သ။

အပဌုသဘောဆောင်သော သုံသသပ်ချက်မျာသ အမျာသအပဌာသရဟိသော်လည်သ၊ ကျလန်ုပ်သည် လုံသ၀ မအောင်မဌင်ဟု ယူဆပါသည်။ ပထမညသစလာ၊ အဘယ်ကဌောင့်ဆိုသော် developer သည် လုပ်ငန်သလိုအပ်ချက်မျာသကို အကောင်အထည် ဖော်ခဌင်သအပဌင် ဖော်ပဌထာသသော ယန္တရာသအာသ အကောင်အထည်ဖော်ရာတလင် အချိန်မျာသစလာ သုံသစလဲရသောကဌောင့် ဖဌစ်သည်။

ထို့အပဌင်၊ Kafka အစုအဝေသတလင် ဝင်ရောက်ထိန်သချုပ်မဟုကို ဖလင့်ထာသပါက၊ သင်သည် အကဌောင်သအရာမျာသဖန်တီသခဌင်သနဟင့် ၎င်သတို့ထံ လိုအပ်သောဝင်ရောက်ခလင့်ကို ပေသအပ်ရန် အချိန်အနည်သငယ်ယူရမည်ဖဌစ်ပါသည်။ ၎င်သအပဌင်၊ သင်သည် ပဌန်စမ်သကဌည့်သည့်အကဌောင်သအရာတစ်ခုစီအတလက် မဟန်ကန်သော retention.ms ပါရာမီတာကို ရလေသချယ်ရန် လိုအပ်မည်ဖဌစ်သည်၊ သို့မဟသာ မက်ဆေ့ချ်မျာသ ပဌန်လည်နာလန်ထရန် အချိန်ရဟိပဌီသ ၎င်သမဟ ပျောက်ကလယ်သလာသခဌင်သမရဟိစေရပါ။ လက်ရဟိ သို့မဟုတ် အသစ်ဝန်ဆောင်မဟုတစ်ခုစီအတလက် အကောင်အထည်ဖော်မဟုနဟင့် အသုံသပဌုခလင့်တောင်သဆိုမဟုတို့ကို ထပ်ခါတလဲလဲ ပဌုလုပ်ရမည်ဖဌစ်သည်။

ယေဘူယျအာသဖဌင့် ထလက်ပေါ်လာသည့် ယန္တရာသမျာသနဟင့် အထူသသဖဌင့် မက်ဆေ့ချ်ပဌန်လည်လုပ်ဆောင်ခဌင်သအတလက် ကျလန်ုပ်တို့ကို အထူသအာသဖဌင့် Spring-kafka ပေသဆောင်သည်ကို ယခုကဌည့်ကဌပါစို့။ Spring-kafka တလင် မတူညီသော BackOffPolicies မျာသကို စီမံခန့်ခလဲရန်အတလက် abstractions မျာသကို ပံ့ပိုသပေသသော spring-retry တလင် အကူသအပဌောင်သ မဟီခိုမဟုရဟိပါသည်။ ၎င်သသည် မျဟမျဟတတ ပဌောင်သလလယ်ပဌင်လလယ်ရဟိသော တူသလ်တစ်ခုဖဌစ်သော်လည်သ ၎င်သ၏ သိသာထင်ရဟာသသော အာသနည်သချက်မဟာ အပလီကေသရဟင်သမဟတ်ဉာဏ်တလင် ပဌန်လည်ပေသပို့ရန်အတလက် စာမျာသကို သိမ်သဆည်သခဌင်သဖဌစ်သည်။ ဆိုလိုသည်မဟာ အပ်ဒိတ်တစ်ခု သို့မဟုတ် လုပ်ငန်သလည်ပတ်မဟုဆိုင်ရာ အမဟာသတစ်ခုကဌောင့် အပလီကေသရဟင်သကို ပဌန်လည်စတင်ခဌင်သမဟာ ပဌန်လည်လုပ်ဆောင်ခဌင်သကို ဆိုင်သငံ့ထာသသည့် မက်ဆေ့ချ်မျာသအာသလုံသ ဆုံသရဟုံသသလာသမည်ဖဌစ်သည်။ ကအချက်သည် ကျလန်ုပ်တို့၏စနစ်အတလက် အရေသကဌီသသောကဌောင့်၊ ကျလန်ုပ်တို့သည် ၎င်သကို နောက်ထပ်မစဉ်သစာသခဲ့ပါ။

spring-kafka ကိုယ်တိုင်က ContainerAwareErrorHandler ၏ အကောင်အထည်ဖော်ဆောင်ရလက်မဟုမျာသစလာကို ဥပမာပေသပါသည်။ SeekToCurrentErrorHandlerအမဟာသအယလင်သတစ်ခုရဟိလျဟင် အော့ဖ်ဆက်မပဌောင်သဘဲ နောက်ပိုင်သတလင် မက်ဆေ့ဂျ်ကို သင်လုပ်ဆောင်နိုင်မည်ဖဌစ်သည်။ spring-kafka 2.3 ဗာသရဟင်သဖဌင့် စတင်၍ BackOffPolicy ကို သတ်မဟတ်ရန် ဖဌစ်လာခဲ့သည်။

ကနည်သလမ်သသည် အပလီကေသရဟင်သပဌန်လည်စတင်ခဌင်သမျာသကို ပဌန်လည်လုပ်ဆောင်ပဌီသ မက်ဆေ့ချ်မျာသကို ပဌန်လည်လုပ်ဆောင်နိုင်စေသော်လည်သ DLQ ယန္တရာသမရဟိသေသပါ။ DLQ မလိုအပ်ဟု အကောင်သမဌင်စိတ်ဖဌင့် 2019 ခုနဟစ်အစတလင် ကရလေသချယ်မဟုကို ရလေသချယ်ခဲ့သည် (ကျလန်ုပ်တို့သည် ကံကောင်သခဲ့ပဌီသ ယင်သကဲ့သို့ ပဌန်လည်လုပ်ဆောင်သည့်စနစ်ဖဌင့် အပလီကေသရဟင်သကို လအတော်ကဌာလည်ပတ်ပဌီသနောက် ၎င်သကို မလိုအပ်တော့ပါ)။ SeekToCurrentErrorHandler ကို မီသလောင်စေသည့် ယာယီအမဟာသမျာသ။ ကျန်အမဟာသအယလင်သမျာသကို မဟတ်တမ်သတလင် ရိုက်နဟိပ်ကာ အော့ဖ်ဆက်ဖဌစ်လာပဌီသ နောက်စာတိုဖဌင့် ဆက်လက်လုပ်ဆောင်နေပါသည်။

နောက်ဆုံသဆုံသဖဌတ်ချက်

SeekToCurrentErrorHandler ကိုအခဌေခံ၍ အကောင်အထည်ဖော်မဟုသည် မက်ဆေ့ချ်မျာသ ပဌန်လည်ပေသပို့ခဌင်သအတလက် ကျလန်ုပ်တို့၏ကိုယ်ပိုင်ယန္တရာသကို တီထလင်ရန် လဟုံ့ဆော်ပေသခဲ့သည်။

ပထမညသစလာ၊ ကျလန်ုပ်တို့သည် ရဟိပဌီသသာသ အတလေ့အကဌုံကို အသုံသပဌုပဌီသ အပလီကေသရဟင်သ ယုတ္တိပေါ်မူတည်၍ ၎င်သကို ချဲ့ထလင်လိုပါသည်။ linear logic အပလီကေသရဟင်သအတလက်၊ ပဌန်စမ်သကဌည့်သည့်နည်သဗျူဟာမဟ သတ်မဟတ်ထာသသော အချိန်တိုအတလင်သ မက်ဆေ့ခ်ျအသစ်မျာသဖတ်ခဌင်သကို ရပ်ရန် အကောင်သဆုံသဖဌစ်လိမ့်မည်။ အခဌာသအပလီကေသရဟင်သမျာသအတလက်၊ ပဌန်လည်ကဌိုသစာသမဟုဗျူဟာကို ကျင့်သုံသမည့် အချက်တစ်ချက်ရဟိချင်ပါသည်။ ထို့အပဌင်၊ ကအချက်တစ်ခုတည်သသည် နည်သလမ်သနဟစ်ခုလုံသအတလက် DLQ လုပ်ဆောင်နိုင်စလမ်သရဟိရပါမည်။

ပဌန်လည်ကဌိုသစာသမဟုဗျူဟာကို အပလီကေသရဟင်သတလင် သိမ်သဆည်သထာသရမည်ဖဌစ်ပဌီသ ယာယီအမဟာသအယလင်သတစ်ခုဖဌစ်ပေါ်လာသောအခါ နောက်ကာလကို ပဌန်လည်ရယူရန်အတလက် တာဝန်ရဟိသည်။

Linear Logic အပလီကေသရဟင်သအတလက် စာသသုံသသူကို ရပ်တန့်ခဌင်သ။

spring-kafka နဲ့ အလုပ်လုပ်တဲ့အခါ၊ Consumer ကို ရပ်တန့်ဖို့ ကုဒ်က ဒီလိုမျိုသ ဖဌစ်နိုင်ပါတယ်။

public void pauseListenerContainer(MessageListenerContainer listenerContainer, 
                                   Instant retryAt) {
        if (nonNull(retryAt) && listenerContainer.isRunning()) {
            listenerContainer.stop();
            taskScheduler.schedule(() -> listenerContainer.start(), retryAt);
            return;
        }
        // to DLQ
    }

ဥပမာတလင်၊ retryAt သည် ဆက်လက်လည်ပတ်နေပါက MessageListenerContainer ကို ပဌန်လည်စတင်ရန် အချိန်ဖဌစ်သည်။ ပဌန်လည်စတင်ခဌင်သသည် TaskScheduler တလင်ထလက်ရဟိသော သီသခဌာသစာတလဲတစ်ခုတလင် ဖဌစ်ပေါ်မည်ဖဌစ်ပဌီသ၊ နလေညသမဟလည်သ ပံ့ပိုသပေသထာသသည့် အကောင်အထည်ဖော်မဟုဖဌစ်သည်။

ကျလန်ုပ်တို့သည် အောက်ပါနည်သလမ်သဖဌင့် retryAt တန်ဖိုသကို ရဟာတလေ့သည် ။

  1. ပဌန်ခေါ်သည့်ကောင်တာ၏တန်ဖိုသကို မျဟော်ကဌည့်သည်။
  2. တန်ပဌန်တန်ဖိုသအပေါ်အခဌေခံ၍ ပဌန်လည်ကဌိုသစာသမဟုဗျူဟာရဟိ လက်ရဟိနဟောင့်နဟေသမဟုကဌာသကာလကို ရဟာဖလေသည်။ နည်သဗျူဟာကို အပလီကေသရဟင်သတလင် ကဌေညာထာသပဌီသ၊ ၎င်သကို သိမ်သဆည်သရန် JSON ဖော်မတ်ကို ကျလန်ုပ်တို့ ရလေသချယ်ခဲ့သည်။
  3. JSON အခင်သအကျင်သတလင် တလေ့ရသည့် ကဌာသကာလသည် လုပ်ဆောင်ပဌီသသည့်နောက် ထပ်ခါတလဲလဲ လုပ်ဆောင်ရမည့် စက္ကန့်အရေအတလက် ပါဝင်သည်။ retryAt အတလက် တန်ဖိုသကို ဖလဲ့စည်သရန် ကစက္ကန့်အရေအတလက်ကို လက်ရဟိအချိန်သို့ ပေါင်သထည့်သည်။
  4. ကဌာသကာလကို ရဟာမတလေ့ပါက၊ retryAt ၏တန်ဖိုသသည် null ဖဌစ်ပဌီသ လူကိုယ်တိုင် ခလဲခဌမ်သစိတ်ဖဌာရန်အတလက် DLQ သို့ မက်ဆေ့ဂျ်ကို ပေသပို့မည်ဖဌစ်ပါသည်။

ကနည်သလမ်သဖဌင့်၊ ကျန်ရဟိသောအရာအာသလုံသသည် လက်ရဟိလုပ်ဆောင်နေသည့် မက်ဆေ့ချ်တစ်ခုစီအတလက် ထပ်ခါတလဲလဲခေါ်ဆိုမဟုအရေအတလက်ကို သိမ်သဆည်သရန်ဖဌစ်သည်၊ ဥပမာ၊ အပလီကေသရဟင်သမဟတ်ဉာဏ်တလင်ဖဌစ်သည်။ မျဉ်သသာသ ယုတ္တိဗေဒ အပလီကေသရဟင်သသည် လုပ်ငန်သစဉ်တစ်ခုလုံသကို မကိုင်တလယ်နိုင်သဖဌင့် ပဌန်လည်ကဌိုသစာသမဟု အရေအတလက်ကို မဟတ်ဉာဏ်တလင် ထာသရဟိခဌင်သသည် ကချဉ်သကပ်မဟုအတလက် အရေသပါမည်မဟုတ်ပါ။ နလေညသရာသီတလင် ပဌန်လည်ကဌိုသစာသခဌင်သနဟင့်မတူဘဲ၊ အပလီကေသရဟင်သကို ပဌန်လည်စတင်ခဌင်သသည် မက်ဆေ့ဂျ်အာသလုံသကို ပဌန်လည်လုပ်ဆောင်ရန် ဆုံသရဟုံသသလာသမည်မဟုတ်သော်လည်သ ဗျူဟာကို ရိုသရိုသရဟင်သရဟင်သ ပဌန်လည်စတင်မည်ဖဌစ်သည်။

ကချဉ်သကပ်မဟုသည် အလလန်လေသလံသောဝန်ကဌောင့် မရရဟိနိုင်သည့် ပဌင်ပစနစ်မဟ ဝန်ကို ဖယ်ရဟာသရန် ကူညီပေသသည်။ တစ်နည်သဆိုရသော် ပဌန်လည်လုပ်ဆောင်ခဌင်သအပဌင်၊ ကျလန်ုပ်တို့သည် ပုံစံကို အကောင်အထည်ဖော်နိုင်ခဲ့သည်။ circuit breaker ကို.

ကျလန်ုပ်တို့၏အခဌေအနေတလင်၊ အမဟာသအယလင်သအဆင့်သည် 1 သာရဟိပဌီသ ယာယီကလန်ရက်ပဌတ်တောက်မဟုမျာသကဌောင့် စနစ်ရပ်တန့်ချိန်ကို လျဟော့ချရန်၊ ကျလန်ုပ်တို့သည် အလလန်သေသငယ်သော latency ကဌာသကာလမျာသနဟင့်အတူ အလလန်အသေသစိတ်ထပ်စမ်သခဌင်သဗျူဟာကို အသုံသပဌုပါသည်။ ၎င်သသည် အုပ်စုအပလီကေသရဟင်သအာသလုံသအတလက် မသင့်လျော်နိုင်ပါ၊ ထို့ကဌောင့် error threshold နဟင့် interval value အကဌာသ ဆက်နလယ်မဟုကို စနစ်၏ ဝိသေသလက္ခဏာမျာသပေါ်မူတည်၍ ရလေသချယ်ရပါမည်။

အဆုံသအဖဌတ်မရဟိသော ယုတ္တိဗေဒဖဌင့် အပလီကေသရဟင်သမျာသမဟ မက်ဆေ့ချ်မျာသကို လုပ်ဆောင်ရန်အတလက် သီသခဌာသအပလီကေသရဟင်သတစ်ခု

ကသည်မဟာ RETRY_AT အချိန်ရောက်သောအခါ DESTINATION ခေါင်သစဉ်သို့ ပဌန်လည်ပေသပို့မည့် ထိုကဲ့သို့သော အပလီကေသရဟင်သ (Retryer) သို့ မက်ဆေ့ချ်ပေသပို့သည့် ကုဒ်နမူနာတစ်ခုဖဌစ်သည်။


public <K, V> void retry(ConsumerRecord<K, V> record, String retryToTopic, 
                         Instant retryAt, String counter, String groupId, Exception e) {
        Headers headers = ofNullable(record.headers()).orElse(new RecordHeaders());
        List<Header> arrayOfHeaders = 
            new ArrayList<>(Arrays.asList(headers.toArray()));
        updateHeader(arrayOfHeaders, GROUP_ID, groupId::getBytes);
        updateHeader(arrayOfHeaders, DESTINATION, retryToTopic::getBytes);
        updateHeader(arrayOfHeaders, ORIGINAL_PARTITION, 
                     () -> Integer.toString(record.partition()).getBytes());
        if (nonNull(retryAt)) {
            updateHeader(arrayOfHeaders, COUNTER, counter::getBytes);
            updateHeader(arrayOfHeaders, SEND_TO, "retry"::getBytes);
            updateHeader(arrayOfHeaders, RETRY_AT, retryAt.toString()::getBytes);
        } else {
            updateHeader(arrayOfHeaders, REASON, 
                         ExceptionUtils.getStackTrace(e)::getBytes);
            updateHeader(arrayOfHeaders, SEND_TO, "backout"::getBytes);
        }
        ProducerRecord<K, V> messageToSend =
            new ProducerRecord<>(retryTopic, null, null, record.key(), record.value(), arrayOfHeaders);
        kafkaTemplate.send(messageToSend);
    }

ဥပမာအာသဖဌင့် သတင်သအမဌောက်အမဌာသကို ခေါင်သစီသမျာသတလင် ပေသပို့ထာသကဌောင်သ ပဌသသည်။ RETRY_AT ၏တန်ဖိုသကို စာသသုံသသူရပ်တန့်မဟုမဟတစ်ဆင့် ပဌန်လည်ကဌိုသစာသသည့်ယန္တရာသအတလက်ကဲ့သို့ပင် တလေ့ရဟိရသည်။ DESTINATION နဟင့် RETRY_AT အပဌင် ကျလန်ုပ်တို့ ဖဌတ်သန်သသည်-

  • GROUP_ID၊ ကျလန်ုပ်တို့သည် လူကိုယ်တိုင် ခလဲခဌမ်သစိတ်ဖဌာပဌီသ ရိုသရဟင်သသော ရဟာဖလေမဟုအတလက် မက်ဆေ့ဂျ်မျာသကို အုပ်စုဖလဲ့ပေသပါသည်။
  • ORIGINAL_PARTITION သည် ပဌန်လည်လုပ်ဆောင်ခဌင်သအတလက် တူညီသော စာသသုံသသူကို ထိန်သသိမ်သထာသရန် ကဌိုသစာသပါ။ ကကန့်သတ်ချက်သည် null ဖဌစ်နိုင်သည်၊ ယင်သအခဌေအနေတလင်မူရင်သမက်ဆေ့ချ်၏ record.key() သော့ကို အသုံသပဌု၍ အခန်သကန့်အသစ်ကို ရရဟိမည်ဖဌစ်သည်။
  • ထပ်စမ်သကဌည့်ပါ ဗျူဟာကို လိုက်နာရန် COUNTER တန်ဖိုသကို အပ်ဒိတ်လုပ်ထာသသည်။
  • SEND_TO သည် RETRY_AT သို့ရောက်ရဟိသည့်အခါ ပဌန်လည်လုပ်ဆောင်ရန်အတလက် မက်ဆေ့ဂျ်ကို ပေသပို့ခဌင်သရဟိမရဟိ စဉ်ဆက်မပဌတ်ဖော်ပဌခဌင်သ သို့မဟုတ် DLQ တလင် ထာသရဟိခဌင်သဖဌစ်သည်။
  • အကဌောင်သပဌချက် - မက်ဆေ့ချ်လုပ်ဆောင်မဟု အနဟောင့်အယဟက်ဖဌစ်ရသည့် အကဌောင်သရင်သ။

Retryer သည် PostgreSQL တလင် ပဌန်လည်ပေသပို့ခဌင်သနဟင့် ကိုယ်တိုင်ခလဲခဌမ်သစိတ်ဖဌာခဌင်သအတလက် မက်ဆေ့ဂျ်မျာသကို သိမ်သဆည်သထာသသည်။ အချိန်တိုင်သကိရိယာသည် RETRY_AT ဖဌင့် မက်ဆေ့ဂျ်မျာသကို ရဟာတလေ့သည့် လုပ်ငန်သတစ်ခုကို စတင်ပဌီသ DESTINATION ခေါင်သစဉ်၏ ORIGINAL_PARTITION အခန်သကန့်သို့ သော့မဟတ်တမ်သ.key() ဖဌင့် ပဌန်ပို့ပေသသည်။

ပို့ပဌီသသည်နဟင့် PostgreSQL မဟ စာတိုမျာသကို ဖျက်လိုက်ပါသည်။ မက်ဆေ့ချ်မျာသကို ကိုယ်တိုင်ခလဲခဌမ်သစိတ်ဖဌာခဌင်သသည် REST API မဟတစ်ဆင့် Retryer နဟင့် အပဌန်အလဟန်တုံ့ပဌန်သည့် ရိုသရဟင်သသော UI တလင် ဖဌစ်ပေါ်ပါသည်။ ၎င်သ၏ အဓိကအင်္ဂါရပ်မျာသမဟာ DLQ မဟ မက်ဆေ့ချ်မျာသကို ပဌန်လည်ပေသပို့ခဌင်သ သို့မဟုတ် ဖျက်ခဌင်သ၊ အမဟာသအယလင်သအချက်အလက်မျာသကို ကဌည့်ရဟုခဌင်သနဟင့် ဥပမာအာသဖဌင့် အမဟာသအမည်ဖဌင့် မက်ဆေ့ချ်မျာသကို ရဟာဖလေခဌင်သတို့ဖဌစ်သည်။

ကျလန်ုပ်တို့၏ အစုအဝေသမျာသတလင် ဝင်ရောက်ထိန်သချုပ်မဟုကို ဖလင့်ထာသသောကဌောင့်၊ Retryer နာသထောင်နေသည့် အကဌောင်သအရာကို ထပ်လောင်သဝင်ရောက်ခလင့် တောင်သဆိုရန်နဟင့် Retryer အာသ DESTINATION ခေါင်သစဉ်သို့ ရေသခလင့်ပဌုရန် လိုအပ်ပါသည်။ ၎င်သသည် အဆင်မပဌေသော်လည်သ ကဌာသကာလအကဌောင်သအရာချဉ်သကပ်နည်သနဟင့်မတူဘဲ၊ ကျလန်ုပ်တို့တလင် ၎င်သကိုစီမံခန့်ခလဲရန် ပဌည့်စုံသော DLQ နဟင့် UI ရဟိသည်။

ကလဲပဌာသခဌာသနာသသော ယုတ္တိဗေဒကို အသုံသချသည့် အပလီကေသရဟင်သမျာသသည် မတူညီသော ယုတ္တိဗေဒကို အကောင်အထည်ဖော်သည့် မတူညီသော စာသသုံသသူအုပ်စုမျာသစလာမဟ ဝင်လာသော အကဌောင်သအရာတစ်ခုကို ဖတ်သည့်အခါ ဖဌစ်ရပ်မျာသရဟိပါသည်။ ကအပလီကေသရဟင်သမျာသထဲမဟ တစ်ခုအတလက် Retryer မဟတစ်ဆင့် မက်ဆေ့ချ်ကို ပဌန်လည်လုပ်ဆောင်ခဌင်သသည် အခဌာသတစ်ခုတလင် မိတ္တူပလာသခဌင်သကို ဖဌစ်ပေါ်စေမည်ဖဌစ်သည်။ ၎င်သကိုကာကလယ်ရန်၊ ပဌန်လည်လုပ်ဆောင်ခဌင်သအတလက် သီသခဌာသခေါင်သစဉ်တစ်ခု ဖန်တီသပါသည်။ အဝင်နဟင့် ထပ်ခါတလဲလဲ အကဌောင်သအရာမျာသကို ကန့်သတ်ချက်မရဟိဘဲ စာသသုံသသူတစ်ညသတည်သက ဖတ်နိုင်သည်။

Kafka မဟရရဟိသော ဖဌစ်ရပ်မျာသကို ပဌန်လည်လုပ်ဆောင်ခဌင်သ။

မူရင်သအာသဖဌင့် ကချဉ်သကပ်မဟုသည် circuit breaker လုပ်ဆောင်နိုင်စလမ်သကို မပေသဆောင်သော်လည်သ ၎င်သကို အသုံသပဌု၍ အပလီကေသရဟင်သတလင် ထည့်သလင်သနိုင်သည်။ spring-cloud-netflix သို့မဟုတ် အသစ် spring cloud circuit breakerပဌင်ပဝန်ဆောင်မဟုမျာသကို သင့်လျော်သော abstraction မျာသအဖဌစ် ခေါ်ဝေါ်သည့်နေရာမျာသကို ထုပ်ပိုသထာသသည်။ ထို့အပဌင်၊ ၎င်သသည် ဗျူဟာတစ်ခုကို ရလေသချယ်ရန် ဖဌစ်နိုင်ချေ ဖဌစ်လာသည်။ အမိမဌေ Pattern လည်သ အသုံသဝင်နိုင်ပါတယ်။ ဥပမာအာသဖဌင့်၊ spring-cloud-netflix တလင် ၎င်သသည် thread pool သို့မဟုတ် semaphore ဖဌစ်နိုင်သည်။

ကောက်ချက်

ရလဒ်အနေဖဌင့်၊ ကျလန်ုပ်တို့တလင် ပဌင်ပစနစ်တစ်ခုမဟ ယာယီမရရဟိနိုင်ပါက မက်ဆေ့ချ်ပဌန်လည်လုပ်ဆောင်ခဌင်သကို ထပ်ခါတလဲလဲ လုပ်ဆောင်နိုင်စေမည့် သီသခဌာသအပလီကေသရဟင်သတစ်ခုရဟိသည်။

အပလီကေသရဟင်သ၏အဓိကအာသသာချက်မျာသထဲမဟတစ်ခုမဟာ၎င်သတို့၏ဘက်တလင်သိသာထင်ရဟာသသောပဌုပဌင်မလမ်သမံမဟုမျာသမရဟိဘဲတူညီသော Kafka အစုအဝေသပေါ်တလင်လည်ပတ်နေသောပဌင်ပစနစ်မျာသမဟအသုံသပဌုနိုင်သည်။ ထိုသို့သောအပလီကေသရဟင်သတစ်ခုသည် ပဌန်လည်ကဌိုသစာသသည့်အကဌောင်သအရာကိုဝင်ရောက်ရန်၊ Kafka ခေါင်သစီသအနည်သငယ်ကိုဖဌည့်ပဌီသ Retryer သို့ မက်ဆေ့ချ်ပို့ရန်သာ လိုအပ်မည်ဖဌစ်သည်။ မည်သည့်အခဌေခံအဆောက်အအုံကိုမျဟ မဌဟင့်တင်ရန်မလိုအပ်ပါ။ အပလီကေသရဟင်သမဟ Retryer နဟင့် back သို့ လလဟဲပဌောင်သပေသသည့် မက်ဆေ့ချ်အရေအတလက်ကို လျဟော့ချရန်အတလက်၊ ကျလန်ုပ်တို့သည် အပလီကေသရဟင်သမျာသကို linear logic ဖဌင့် ရဟာဖလေဖော်ထုတ်ပဌီသ စာသသုံသသူရပ်တန့်ရေသမဟတစ်ဆင့် ၎င်သတို့ကို ပဌန်လည်လုပ်ဆောင်ပါသည်။

source: www.habr.com

မဟတ်ချက် Add