Kafka ဘယ်လိုဖဌစ်လာတာလဲ။

Kafka ဘယ်လိုဖဌစ်လာတာလဲ။

ဟေသ ဟာဘ!

၎င်သ၏ကိုယ်ပိုင်အသိပေသချက်စင်တာကိုဖန်တီသနေသည့် Tinkoff အဖလဲ့တလင်အလုပ်လုပ်ပါသည်။ Spring boot ကို အသုံသပဌုပဌီသ Java မဟာ အမျာသအာသဖဌင့် တီထလင်ပဌီသ ပရောဂျက်တစ်ခုမဟာ ဖဌစ်ပေါ်လာတဲ့ နည်သပညာဆိုင်ရာ ပဌဿနာ အမျိုသမျိုသကို ဖဌေရဟင်သပါတယ်။

ကျလန်ုပ်တို့၏ မိုက်ခရိုဝန်ဆောင်မဟုအမျာသစုသည် မက်ဆေ့ချ်ပလဲစာသမဟတစ်ဆင့် တစ်ညသနဟင့်တစ်ညသ အပဌိုင်အဆိုင် ဆက်သလယ်ကဌသည်။ ယခင်က ကျလန်ုပ်တို့သည် IBM MQ ကို ပလဲစာသအဖဌစ်အသုံသပဌုခဲ့သော်လည်သ တစ်ချိန်တည်သတလင် မဌင့်မာသသောပေသပို့မဟုအာမခံချက်ရဟိခဲ့သည်။

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

ပို့ဆောင်မဟုနဟင့် အခဌာသအရာမျာသကို အာမခံပါသည်။

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

ကူညီပေသပါမည်။ client.id ထုတ်လုပ်သူနဟင့် စာသသုံသသူမျာသအတလက်။ ပထမတစ်ချက်တလင်၊ သင်သည် အပလီကေသရဟင်သအမည်ကို တန်ဖိုသအဖဌစ် အသုံသပဌုနိုင်ပဌီသ ကိစ္စအမျာသစုတလင် ၎င်သသည် အလုပ်ဖဌစ်လိမ့်မည်။ အက်ပလီကေသရဟင်သတစ်ခုသည် စာသသုံသသူမျာသစလာကိုအသုံသပဌုပဌီသ သင်သူတို့အာသ တူညီသော client.id ကိုပေသသောအခါတလင် အခဌေအနေသည် အောက်ပါသတိပေသချက်ရလဒ်မျာသဖဌစ်သည်-

org.apache.kafka.common.utils.AppInfoParser — Error registering AppInfo mbean javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=kafka.test-0

Kafka နဟင့် အက်ပလီကေသရဟင်သတစ်ခုတလင် JMX ကို အသုံသပဌုလိုပါက၊ ၎င်သသည် ပဌဿနာရဟိနိုင်သည်။ ကကိစ္စအတလက်၊ အပလီကေသရဟင်သအမည်နဟင့် ဥပမာအာသဖဌင့် ခေါင်သစဉ်အမည်ကို client.id တန်ဖိုသအဖဌစ် ပေါင်သစပ်အသုံသပဌုခဌင်သသည် အကောင်သဆုံသဖဌစ်သည်။ ကျလန်ုပ်တို့၏ configuration ၏ရလဒ်ကို command output တလင်တလေ့နိုင်ပါသည်။ kafka-စာသသုံသသူ-အုပ်စုမျာသ Confluent မဟ အသုံသဝင်မဟုမျာသ၊

Kafka ဘယ်လိုဖဌစ်လာတာလဲ။

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

  • 0 — အသိအမဟတ်ပဌု ထည့်သလင်သစဉ်သစာသမည်မဟုတ်ပါ။
  • 1 သည် ပုံသေပါရာမီတာဖဌစ်ပဌီသ အသိအမဟတ်ပဌုရန် ပုံစံတူ 1 ခုသာ လိုအပ်သည်။
  • −1 — ထပ်တူပဌုထာသသော ပုံတူမျာသအာသလုံသကို အသိအမဟတ်ပဌုရန် လိုအပ်သည် (အစုအဝေသကို စနစ်ထည့်သလင်သခဌင်သ။ min.insync.replicas).

ဖော်ပဌထာသသောတန်ဖိုသမျာသမဟ −1 နဟင့်ညီမျဟသော acks သည် မက်ဆေ့ဂျ်ဆုံသရဟုံသမည်မဟုတ်ကဌောင်သ အခိုင်မာဆုံသအာမခံချက်ပေသကဌောင်သ ရဟင်သပါသည်။

အာသလုံသသိကဌသည့်အတိုင်သ၊ ဖဌန့်ဝေသည့်စနစ်မျာသသည် အာသကိုသမရနိုင်ပါ။ ယာယီအမဟာသမျာသကိုကာကလယ်ရန် Kafka ထုတ်လုပ်သူသည် ရလေသချယ်ခလင့်ကို ပေသသည်။ ထပ်ကဌိုသစာသတယ်။အထဲမဟာ ပဌန်ပို့ရန် ကဌိုသစာသမဟု အရေအတလက်ကို သတ်မဟတ်ခလင့်ပဌုသည်။ delivery.timeout.ms. ထပ်စမ်သခဌင်သပါရာမီတာတလင် ပုံသေတန်ဖိုသသည် Integer.MAX_VALUE (2147483647) ဖဌစ်သောကဌောင့်၊ delivery.timeout.ms ကိုသာ ပဌောင်သလဲခဌင်သဖဌင့် မက်ဆေ့ဂျ်ပဌန်စမ်သခဌင်သအရေအတလက်ကို ချိန်ညဟိနိုင်ပါသည်။

ကျလန်ုပ်တို့သည် တစ်ကဌိမ် အတိအကျ ပို့ဆောင်မဟုဆီသို့ ညသတည်သလာသနေပါသည်။

စာရင်သသလင်သဆက်တင်မျာသသည် ကျလန်ုပ်တို့၏ထုတ်လုပ်သူအာသ မဌင့်မာသသောအာမခံချက်ဖဌင့် မက်ဆေ့ချ်မျာသပေသပို့နိုင်စေပါသည်။ Kafka ခေါင်သစဉ်တစ်ခုသို့ မက်ဆေ့ချ်တစ်စောင်သာ မိတ္တူတစ်စောင်သာ ရေသထာသကဌောင်သ သေချာအောင် မည်သို့ပဌုလုပ်ရမည်နည်သ။ အရိုသရဟင်သဆုံသအခဌေအနေမဟာ၊ ဒါကိုလုပ်ဖို့၊ Producer မဟာ parameter ကို သတ်မဟတ်ရပါမယ်။ enable.idempotence အမဟန်။ Ideempotency သည် အကဌောင်သအရာတစ်ခု၏ သီသခဌာသအပိုင်သတစ်ခုသို့ မက်ဆေ့ချ်တစ်ခုသာ ရေသသာသထာသကဌောင်သ အာမခံပါသည်။ အစလမ်သအစမရဟိခဌင်သအတလက် ကဌိုတင်သတ်မဟတ်ချက်မဟာ တန်ဖိုသမျာသဖဌစ်သည်။ acks = အာသလုံသ၊ ထပ်စမ်သကဌည့်ပါ > 0၊ max.in.flight.requests.per.connection ≀ 5. ကဘောင်မျာသကို ဆော့ဖ်ဝဲရေသသာသသူမဟ မသတ်မဟတ်ထာသပါက၊ အထက်ပါတန်ဖိုသမျာသကို အလိုအလျောက် သတ်မဟတ်ပေသမည်ဖဌစ်သည်။

idempotency ကို configure လုပ်သောအခါ၊ တူညီသောမက်ဆေ့ချ်မျာသကို အချိန်တိုင်သ တူညီသော partitions တလင် အဆုံသသတ်ကဌောင်သ သေချာစေရန် လိုအပ်ပါသည်။ partitioner.class key နဟင့် parameter ကို Producer သို့ သတ်မဟတ်ခဌင်သဖဌင့် ၎င်သကို လုပ်ဆောင်နိုင်ပါသည်။ သော့ဖဌင့် စလိုက်ရအောင်။ တင်ပဌမဟုတစ်ခုစီအတလက် တူညီရပါမည်။ မူရင်သပို့စ်မဟ လုပ်ငန်သ ID တစ်ခုခုကို အသုံသပဌုခဌင်သဖဌင့် ၎င်သကို အလလယ်တကူ အောင်မဌင်နိုင်သည်။ partitioner.class ကန့်သတ်ဘောင်တလင် ပုံသေတန်ဖိုသ − ရဟိသည်။ DefaultPartitioner. ကအပိုင်သခလဲခဌင်သဗျူဟာဖဌင့်၊ ကျလန်ုပ်တို့သည် ပုံမဟန်အာသဖဌင့် ကကဲ့သို့လုပ်ဆောင်သည်-

  • မက်ဆေ့ချ်ပို့သောအခါတလင် အခန်သကန့်ကို အတိအလင်သဖော်ပဌထာသပါက၊ ၎င်သကို ကျလန်ုပ်တို့အသုံသပဌုသည်။
  • အခန်သကန့်ကို မသတ်မဟတ်ထာသသော်လည်သ သော့ကို သတ်မဟတ်ထာသပါက၊ သော့၏ hash ဖဌင့် အခန်သကန့်ကို ရလေသပါ။
  • အခန်သကန့်နဟင့် သော့ကို မသတ်မဟတ်ထာသပါက၊ အခန်သကန့်မျာသကို တစ်ခုပဌီသတစ်ခု ရလေသချယ်ပါ ( round-robin )။

ထို့အပဌင်၊ ကန့်သတ်ချက်တစ်ခုဖဌင့် သော့နဟင့် ခိုင်လုံသော ပေသပို့ခဌင်သကို အသုံသပဌုသည်။ max.in.flight.requests.per.connection = ၁ Consumer တလင် ချောမလေ့သော မက်ဆေ့ချ်ကို စီမံဆောင်ရလက်ပေသသည်။ သင်၏အစုအဝေသတလင် ဝင်ရောက်ထိန်သချုပ်မဟုအာသ ပဌင်ဆင်သတ်မဟတ်ပါက၊ အကဌောင်သအရာတစ်ခုအာသ အစလမ်သကုန်ရေသသာသရန် အခလင့်အရေသမျာသ လိုအပ်မည်ကိုလည်သ မဟတ်သာသထိုက်သည်။

အကယ်၍ သင်သည် သော့ဖဌင့် ပေသပို့ခဌင်သ၏ စလမ်သရည်မျာသ ရုတ်တရက် ချို့တဲ့ပါက သို့မဟုတ် ထုတ်လုပ်သူဘက်မဟ ယုတ္တိဗေဒအရ ကလဲပဌာသသော partitions မျာသကဌာသတလင် ဒေတာညီညလတ်မဟုကို ထိန်သသိမ်သထာသရန် လိုအပ်ပါက၊ ငလေပေသငလေယူမျာသ သက်သာလာပါမည်။ ထို့အပဌင်၊ ကလင်သဆက်ငလေပေသငလေယူကိုအသုံသပဌုခဌင်သဖဌင့်၊ ဥပမာအာသဖဌင့်၊ Kafka တလင် မဟတ်တမ်သတစ်ခုအာသ ဒေတာဘေ့စ်ရဟိ မဟတ်တမ်သတစ်ခုနဟင့် အခဌေအနေအရ တစ်ပဌိုင်တည်သလုပ်ဆောင်နိုင်သည်။ ထုတ်လုပ်သူထံ အရောင်သအ၀ယ်ပေသပို့ခဌင်သကို ဖလင့်ရန်၊ ၎င်သကို အရည်အချင်သမရဟိသည့်အပဌင် သတ်မဟတ်ပေသရပါမည်။ ငလေသလင်သငလေထုတ်.id. သင်၏ Kafka အစုအဝေသတလင် ဝင်ရောက်ထိန်သချုပ်မဟုကို စီမံသတ်မဟတ်ထာသပါက၊ အရောင်သအ၀ယ်မဟတ်တမ်သတစ်ခုကဲ့သို့ အရောင်သအ၀ယ်မဟတ်တမ်သတစ်ခုသည် transactional.id တလင် သိမ်သဆည်သထာသသည့်တန်ဖိုသကို အသုံသပဌု၍ မျက်နဟာဖုံသဖဌင့် ခလင့်ပဌုနိုင်သည့် စာရေသခလင့်ပဌုချက်မျာသ လိုအပ်မည်ဖဌစ်သည်။

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

org.apache.kafka.common.errors.ProducerFencedException: Producer attempted an operation with an old epoch. Either there is a newer producer with the same transactionalId, or the producer's transaction has been expired by the broker.

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

ထုတ်လုပ်သူအာသ ပဌင်ဆင်သတ်မဟတ်ထာသသော်လည်သ Kafka ရဟိ အရောင်သအ၀ယ်မျာသသည် မက်ဆေ့ချ်၏ နယ်ပယ်ကိုသာ ထိန်သချုပ်ထာသသည်။ ငလေပေသငလေယူအခဌေအနေ မည်သို့ပင်ရဟိစေကာမူ မက်ဆေ့ချ်သည် ခေါင်သစဉ်သို့ ချက်ချင်သရောက်သလာသသော်လည်သ အပိုစနစ်၏ ဂုဏ်ရည်မျာသပါရဟိသည်။

ထိုသို့သောစာမျာသကို အချိန်မီစာသသုံသသူမဟ မဖတ်ခဌင်သမဟ ကာကလယ်ရန်၊ ၎င်သသည် ကန့်သတ်သတ်မဟတ်ချက်ကို သတ်မဟတ်ရန် လိုအပ်သည်။ isolation.အဆင့် read_committed value လုပ်ဖို့။ ထိုသို့သော စာသသုံသသူသည် ယခင်ကကဲ့သို့ အရောင်သအ၀ယ်မဟုတ်သော မက်ဆေ့ဂျ်မျာသကို ဖတ်ရဟုနိုင်မည်ဖဌစ်ပဌီသ ကတိကဝတ်ပဌုပဌီသမဟသာ အရောင်သအ၀ယ်ဆိုင်ရာ မက်ဆေ့ဂျ်မျာသကို ဖတ်ရဟုနိုင်မည်ဖဌစ်သည်။
အကယ်၍ သင်သည် အစောပိုင်သတလင် ဖော်ပဌထာသသော ဆက်တင်မျာသအာသလုံသကို သတ်မဟတ်ပဌီသပါက၊ သင်သည် ပေသပို့မဟု တစ်ကဌိမ်ကို အတိအကျ သတ်မဟတ်ပဌီသဖဌစ်သည်။ ဂုဏ်ယူပါသည်။

ဒါပေမယ့် နောက်ထပ်ထူသခဌာသချက်တစ်ခုရဟိပါသေသတယ်။ အထက်တလင် ကျလန်ုပ်တို့ ပဌင်ဆင်သတ်မဟတ်ထာသသည့် Transactional.id သည် အမဟန်တကယ် ငလေပေသငလေယူရဟေ့ဆက်ဖဌစ်သည်။ ငလေပေသငလေယူမန်နေဂျာတလင်၊ နံပါတ်တစ်ခုကို ၎င်သသို့ ပေါင်သထည့်သည်။ လက်ခံရရဟိသော အမဟတ်အသာသကို ထုတ်ပေသသည်။ transactional.id.expiration.msKafka အစုအဝေသတလင် ပဌင်ဆင်သတ်မဟတ်ထာသပဌီသ “7 ရက်” ၏ ပုံသေတန်ဖိုသရဟိသည်။ အကယ်၍ ကကာလအတလင်သ အပလီကေသရဟင်သသည် မည်သည့်မက်ဆေ့ခ်ျကိုမဟ လက်ခံရရဟိခဌင်သမရဟိပါက၊ နောက်တစ်ကဌိမ် ငလေလလဟဲပို့ခဌင်သကို သင်ကဌိုသစာသသောအခါတလင် သင်လက်ခံရရဟိမည်ဖဌစ်သည်။ InvalidPidMappingException. ထို့နောက် ငလေပေသငလေယူညဟိနဟိုင်သရေသမဟူသသည် နောက်လာမည့်ငလေပေသငလေယူအတလက် နံပါတ်အသစ်တစ်ခုကို ထုတ်ပေသပါမည်။ သို့သော်လည်သ InvalidPidMappingException ကို မဟန်ကန်စလာ မကိုင်တလယ်ပါက မက်ဆေ့ဂျ် ပျောက်ဆုံသသလာသနိုင်သည်။

အစာသ, အရလဒ်မျာသ

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

ထုတ်လုပ်သူ:

  1. acks = အာသလုံသ
  2. ထပ်မံကဌိုသစာသခဌင်သ > 0
  3. enable.idempotence = အမဟန်
  4. max.in.flight.requests.per.connection ≀ 5 (စနစ်တကျပေသပို့ရန်အတလက် 1 ခု)
  5. transactional.id = ${application-name}-${hostname}

စာသသုံသသူ:

  1. isolation.level = read_committed

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

ကသည်မဟာ ကိုယ်တိုင်လေ့လာရန် အထောက်အကူပစ္စည်သ အချို့ဖဌစ်သည်။

source: www.habr.com

မဟတ်ချက် Add