Low-Level Architecture & Rust

Microsecond Latency: Building Ultra-Fast Backends with Rust and Axum

যখন মিলিয়ন রিকোয়েস্ট পার সেকেন্ড (RPS) হ্যান্ডেল করার এবং ক্লাউড হোস্টিং কস্ট বা সার্ভার ওভারহেড এক ধাক্কায় ৮০% কমিয়ে আনার প্রসঙ্গ আসে, তখন বিশ্বমানের বড় বড় আইটি জায়ান্টরা তাদের ব্যাকএন্ড আর্কিটেকচারকে Node.js, Python বা Go থেকে সরিয়ে **Rust** ল্যাঙ্গুয়েজে শিফট করছে।

রাসট-এর সবচেয়ে বড় পাওয়ার হলো এটি কোনো Garbage Collector (GC) ছাড়াই রান করে এবং কম্পাইল টাইমে তার নিজস্ব Borrow Checker নিয়মের মাধ্যমে মেমোরি সেফটি গ্যারান্টি দেয়। এর ফলে মেমোরি লিক বা র‍্যামের অতিরিক্ত লোডের ভয় থাকে না এবং ল্যাটেন্সি স্পিড মিলি-সেকেন্ড (ms) থেকে মাইক্রো-সেকেন্ডে (μs) নেমে আসে। আজ আমরা রাসট-এর অন্যতম পপুলার এবং হাই-পারফরম্যান্স ফ্রেমওয়ার্ক **Axum** এবং অ্যাসিনক্রোনাস রানটাইম **Tokio** ব্যবহার করে একটি সুপার-ফাস্ট এপিআই আর্কিটেকচার সেটআপ করা শিখবো।

১. কার্গো সেটিংস (Cargo.toml কনফিগারেশন)

আপনার রাসট প্রজেক্টের ডিপেন্ডেন্সি ম্যানেজমেন্ট ফাইলে নেটওয়ার্কিং এবং সিরিয়ালাইজেশনের জন্য প্রয়োজনীয় ক্রেটস (Crates) যুক্ত করে নিন:

[package]
name = "ahyan-rust-backend"
version = "0.1.0"
edition = "2021"

[dependencies]
axum = "0.7.4"
tokio = { version = "1.35", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

ধাপ ২: কোর সার্ভার সোর্স কোড রাইটিং

আপনার প্রজেক্টের src/main.rs ফাইলটি ওপেন করুন এবং একটি কাস্টম মাল্টি-থ্রেডেড অ্যাসিনক্রোনাস এন্ডপয়েন্ট তৈরি করতে নিচের প্রিমিয়াম কোড আর্কিটেকচারটি ব্যবহার করুন:

use axum::{routing::get, Json, Router};
use serde::Serialize;
use std::net::SocketAddr;

// ক্লায়েন্ট রেসপন্সের জন্য কাস্টম স্ট্রাকচার ডিক্লেয়ারেশন
#[derive(Serialize)]
struct StatusResponse {
    status: String,
    engine: String,
    latency: String,
}

// অ্যাসিনক্রোনাস হ্যান্ডলার ফাংশন
async fn check_status_handler() -> Json<StatusResponse> {
    let response = StatusResponse {
        status: "Active".to_string(),
        engine: "Rust Axum v0.7".to_string(),
        latency: "< 50 Microseconds".to_string(),
    };
    Json(response)
}

#[tokio::main]
async fn main() {
    // ১. রাউটিং ম্যাপ জেনারেট করা
    let app = Router::new().route("/api/v1/status", get(check_status_handler));

    // ২. সার্ভার সকেট বাইন্ডিং এড্রেস সেটআপ
    let addr = SocketAddr::from(([127, 0, 0, 1], 4000));
    println!("🚀 Ultra-fast Rust Microservice spinning up on http://{}", addr);

    // ৩. টোকিও রানটাইমের মাধ্যমে সার্ভার লিসেনিং স্টার্ট করা
    let listener = tokio::net::TcpListener::bind(&addr).await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

ধাপ ৩: বেঞ্চমার্ক টেস্ট ভেরিফিকেশন

প্রজেক্টটি প্রোডাকশন অপ্টিমাইজড মোডে রান করতে লিখুন: cargo run --release। সাধারণ ডেভেলপমেন্ট রান বা ডিবাগ রান এর চেয়ে রিলিজ মোডে রাসট কোড শত গুণ বেশি অপ্টিমাইজড এবং ফাস্ট এক্সিকিউট হয়।

সার্ভার চালু হওয়ার পর wrk বা autocannon এর মতো লোড-টেস্টিং টুল দিয়ে পরীক্ষা করলে দেখা যাবে, যেখানে একটি সাধারণ এক্সপ্রেস জেএস সার্ভার প্রতি সেকেন্ডে ৪-৫ হাজার রিকোয়েস্ট প্রসেস করতে গিয়ে ১০০% সিপিইউ ব্লক করে ফেলে, সেখানে এই রাসট আর্কিটেকচারটি বিন্দুমাত্র সিপিইউ প্রেশার বা মেমোরি ড্রপ ছাড়াই প্রতি সেকেন্ডে অনায়াসে ৫০,০০০+ রিকোয়েস্ট হ্যান্ডেল করে নিচ্ছে!

টেলিগ্রাম ডাটাবেজ প্রোটোকল ট্রিক: আপনি যদি কোনো বড় স্কেলের চ্যাট অ্যাপ্লিকেশন বা কন্টেন্ট ডেলিভারি সিস্টেম তৈরি করতে চান, তবে কস্ট মিনিমাইজ করতে এই রাসট ব্যাকএন্ডের ভেতরে ব্যাকগ্রাউন্ড ডাটা পাইপলাইন হিসেবে মেটার বা টেলিগ্রাম এপিআই কে কানেক্ট করে সরাসরি ক্লাউড ডাটাবেজ মেকানিজমে কনভার্ট করে নিতে পারেন।