SwiftNIO မှတ်စု ၁
SwiftNIO ကိုသုံးပြီး server တစ်ခု bootstrap လုပ်တဲ့အခါမှာ သုံးလို့ရတဲ့ option တွေနဲ့ သူတို့ရဲ့ အကျိုးကျေးဇူးကို ဒီနေ့လေ့လာဖြစ်သလောက် ချရေးထားပါတယ်
serverChannelOption(ChannelOptions.backlog, value: 256)
ကျွန်တော်ကတော့ “the size of the waiting room outside your server’s front door” လို့အလွယ်မှတ်ထားပါတယ် user တစ်ယောက်က server ကို connect လုပ်ဖို့ကြိုးစားတဲ့အခါ SwiftNIO က ဒီ connection attempt ကိုမသိသေးခင် OS level မှာ TCP handshake လိုကောင်မျိုးတွေလုပ်ရပါတယ် ဆိုကြပါစို့ server ကတစ်လုံးတည်းရှိတယ် လူအယောက်ငါးရာလောက်က millisecond အတွင်း ပြိုင်ချိတ်ရင် server က အကုန် process မလုပ်နိုင်တဲ့အတွက် connection drop ပါမယ် အဲ့လိုမဖြစ်ရအောင် OS level handshake တော့ဖြစ်ပြီးပြီ ဒါပေမယ့် nio က လက်မခံနိုင်သေးရင် backlog ထဲမှာ connection ၂၅၆ ခုအထိ queue လုပ်ထားနိုင်တယ်လို့ configure လုပ်တာဖြစ်ပါတယ် ဒီပြသနာက network spike ဖြစ်တဲ့အခါ single server pov ကနေ connection drop မဖြစ်အောင် backlog ထဲ ထည့်နိုင်သလောက်ထည့်တာမျိုးပါ
serverChannelOption(ChannelOptions.socket(SocketOptionLevel(SOL_SOCKET), SO_REUSEADDR), value: 1)
Server တစ်လုံး boot လိုက်ရင် IP address နဲ့ port ပေါ်မှာ socket တစ်ခုသွားချိတ်ပါတယ်။ နောက်ပိုင်း server crash သွားလို့ဖြစ်ဖြစ် တမင်ပိတ်လိုက်လို့ဖြစ်ဖြစ် ပိတ်ပြီး ချက်ချင်း reboot ပြန်လုပ်တဲ့အခါ “address already in use” ဆိုတဲ့ပြသနာတက်ပါတယ် အကြောင်းက OS က ခုနက address နဲ့ network socket ကို ချက်ချင်းမပိတ်ပါဘူး ဘာကြောင့်လဲဆိုတော့ ခုနက server ပြုတ်သွားသည့်တိုင် နောက်ဆုံးချိတ်တုန်းက ကျန်ခဲ့နိုင်တဲ့ stray data packet တွေ ရှိနိုင်သေးတဲ့အတွက် connection အသစ်မှာ မှားပြီးမပါသွားအောင် ဒီ port ကို ခေတ္တ lockdown လုပ်ပါတယ် ဒါက safety feature ဖြစ်ပေမယ့် dev တွေအတွက်ဆို server ကို restart လုပ်ချင်တိုင်းတစ်မိနစ်လောက်ထိုင်စောင့်ရမှာဆိုတော့ အဲ့ lockdown ကို bypass လုပ်တဲ့ option ပါ value 1 ဆိုတာကတော့ True ဒီ feature ကို on မယ် လို့ပြောတာပါ
childChannelOption(ChannelOptions.socket(IPPROTO_TCP, TCP_NODELAY), value: 1)
ကျွန်တော်သိသလောက် swift-nio က netty (Java နဲ့ရေးထား) ကို swift ပြန်ပြောင်းထားတာပါ ဆိုတော့ အခေါ်အဝေါ်လေးတွေက channel ဆိုတာ connection ကို ပြောတာပါ
နားလည်ထားသလောက်က server channel ဆိုတာက operating system ရဲ့ port ပေါ်မှာ သွားပြီး OS resource ကို ယူသုံးတဲ့ connection ဖြစ်ပြီးတော့ child connection ဆိုတာက ခုနက OS resource ကို ယူသုံးတဲ့ connection ကို လာ hit တဲ့ client (web, mobile) တစ်ယောက်ချင်းရဲံ connection ကို ခေါ်တာပါ အဲ့လိုဆိုရင် ယေဘူယျအားဖြင့် server connection ၁ ခုမှာ child connection n အထိရှိနိုင်ပါတယ်
အပေါ်က option က child connection တစ်ခုစီတိုင်းမှာ Nagle’s Algorithm အရ built-in network buffering system ကို turn off လုပ်တာပါ ဆိုလိုတာက OS တွေက အင်တာနက်ပေါ်မှာ packet (data) တွေပို့တဲ့အခါ efficient ဖြစ်ဖို့ကြိုးစားပါတယ် အဲ့တော့ bandwidth ကိုချွေတာဖို့ data size သေးသေးလေးတွေ ခဏခဏပို့တာထက် ခဏလောက်စောင့်ကြည့်ပြီးမှ ခုနကသေးသေးလေးတွေပေါtooင်းပြီး ပို့ပေးလိုက်တာပါ အဲ့တာက bandwidth အတွက်ဖြစ်ပေမယ့် end user ဘက်က latency ရှိတဲ့အတွက် speed over bundle efficiency ကိုဦးစားပေးခိုင်းတဲ့ option ပါ
childChannelOption(ChannelOptions.maxMessagesPerRead, value: 16)
Client က data အကြီးကြီးပို့လိုက်ရင် swiftnio က client တစ်ခုတည်းကိုပဲ သူ့ resource အကုန်ပေးပြီး process လုပ်နေရပါလိမ့်မယ် ဒါကြောင့် client က data တွေအများကြီးပို့ရင်တောင် maximum 16 chunks ပြီးရင် ဒီ client ကိုခဏရပ်ပြီးနောက်ကျန်နေတဲ့ client connection တွေကို server လုပ်ဖို့ ထိန်းထားတာဖြစ်ပါတယ် ဒီနည်းနဲ့ client connection တွေအားလုံးကို process လုပ်တာမှာ fair ဖြစ်အောင် option ထည့်ပေးလို့ရပါတယ် ဒီအပိုင်းက ကျွန်တော် system design ဖတ်တော့ algorithm တွေအများကြီးရှိတာတွေ့ရပါတယ်
childChannelOption(ChannelOptions.recvAllocator, value: AdaptiveRecvByteBufferAllocator())
Client ဆီက data တွေရောက်လာတဲ့အခါ swiftnio က သူ့ရဲ့ host os ပေါ်မှာ RAM allocate (buffer) လုပ်ရပါတယ် ဒါမှသာ swift server က code ထဲကနေ လှမ်းပြီးအဲ့ data ကို read လို့ရမှာဖြစ်ပါတယ် အဲ့လို allocate လုပ်တဲ့အခါ read တိုင်းအတွက် 64KB allocate လုပ်ပြီး user က 100byte text message လောက်ပို့တယ်ဆိုရင် wasteful ဖြစ်ပါတယ် အဲ့လိုမဟုတ်ဘဲ server က 1KB လောက်ပဲ allocate လုပ်ပြီး user က 5MB လောက်ရှိတဲ့ image file ပို့လိုက်ရင် server က နည်းနည်းလောက် read လုပ်လိုက် မလောက်တော့ခဏရပ်ပြီးထပ် allocate ထပ် read ဆို တော်တော်နှေးပါတယ် အဲ့လိုမဖြစ်ရအောင် client ပို့လိုက်တဲ့ data size အပေါ်မူတည်ပြီး RAM ကို dynamically allocate လုပ်ခိုင်းတဲ့ option ပါ
ဒါတွေက ကျွန်တော် AI ကို ကျွန်တော်မရှင်းတာတွေမေးပြီး မှတ်ထားတာတွေဖြစ်တဲ့အတွက် အကုန်မှန်မယ်မဆိုလိုပါဘူး ကျွန်တော်လည်း ဒီအပိုင်းလေ့လာနေရင်း တစ်ခါတည်း ကိုယ်ဘယ်လောက်နားလည်လဲစစ်ပြီးသားဖြစ်သွားအောင် ချရေးကြည့်လိုက်တာပါ။
Comments are powered by Giscus (GitHub Discussions). Loading them fetches resources from GitHub.