Go র সার্ভারে আসলে কি ঘটে?
ধরেন আপনি go তে একটা সার্ভার বানাইলেন, খুবি সিম্পল একটা।
pacakge main import ( "log" "fmt" "net/http" ) func aboutHandler(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, "Some random text") } func main(){ http.HandleFunc("/about", aboutHandler) log.Println("Starting server on :8080") log.Fatal(http.ListenAndServe(":8080", nil)) }
কি কাহিনী ঘটছে এইখানে? আপনি ব্রাউসার এ হিট করলেন http://localhost:8080/about, আর আপনাকে সার্ভার some random text টা সেন্ড করলো। কিভাবে?
ধরেন আপনি ক্লায়েন্ট , ব্রাউসার এ গিয়ে কিছু লিখলেন , সেটা সার্ভার এ যাবে, আপনার রাউটার থেকে সার্ভার এর রাউটার অবধি নেটওয়ার্কিং এর মাদ্ধমে, রাউটার তখন এইটারে সার্ভার এর NIC তে পাঠায় । NIC এইটারে নিয়ে ওর রিসিভ buffer এ রাখে। আর os রে ইনফর্ম করে।
সার্ভার এর তো আপনার সাথে কানেক্ট হইতে হইবে, সার্ভার কিভাবে হবে ? উত্তর হইলো socket ক্রিটে এর মাদ্ধমে। সার্ভার একটা সকেট বানাইবে , ক্লায়েন্ট এর সাথে connect হবার জন্য । TCP/IP , সার্ভার এই কাননেশন এর কাহিনী ঘটানোর জন্য কিছু কাজ করে ,
http.ListenAndServe(":8080", nil)
এই লাইন তলে তোলে একটা tcp এর জন্য os এর কাছে রিকোয়েস্ট করে ,
net.Listen("tcp", ":8080")
OS গিয়া go এর runtime রে বলে যে দেখো, তোমার জন্য কিছু ডাটা আসছে। এখন ওই যে go এর Listen, Accept করার জন্য কাজে লেগে পরে , রিকোয়েস্ট আসবে , আর সে accept করবে , না আসা অবধি ঘুমায়।
go এর runtime তখন বলে , কোন goroutine এই data চাইসে ? goruntime তখন ওই accept রে ঘুম থেইকা উঠায় । সে ডাটা read করে, নতুন goroutine বানায় , আর ওই নতুন goroutine ডাটা হ্যান্ডেল করে। এখন সার্ভার রাউটিং টেবিল এ খুঁজতে থাকে যে কোন route আমারে এই data এর জন্য বলছে?
mux বা router তখন সেই রাউটার বাইর করে।
data তখন সকেট এর write buffer এ যায়। socket তখন kernel কে বলে boss data পাইছি । kernel NIC রে বলে এই নেও , যে খান দিয়া আইছে , ঐখানে পাঠাও । NIC তখন রাউটার এর মাদ্ধমে আমাদের কাছে ডাটা সেন্ড করে .
📌 TL;DR
Client → Router → NIC → NIC RX buffer → Kernel interrupt → socket receive buffer → FD readable → goroutine wake → handler execute → response write → socket send buffer → kernel → NIC TX buffer → Router → Client
NIC, Kernel, Goroutine, Poller, Socket, সব মিলে এক জাদুর কাহিনী।