Port 0

যখন একই application একাধিক instance এর জন্য Port conflict হয় , তখন PORT 0 ( zero ) ব্যবহার করার solution চিন্তা করেছিলাম। এটি করে Operating System একটি available port assign করে। এর ফলে, একাধিক process একই port এ allocate হবে না ।

কখনো port conflicting এ পড়েছেন ? একই app এর দুইটা বাঁ কয়েকটা instance লাগবে । Port আলাদা করে dynamic করে run করা লাগে । It doesn't scale well . আমি এরকম একটা situation এ পড়েছিলাম যে E2E test এর জন্য প্রতি test case রান করার আগে নতুন করে server ( api ) রান করতে হবে ।

সমস্যা হল ১০০০ টা test case থাকলে আর প্রতিটা test case যদি ২ সেকেন্ড চলে তাহলে প্রতিবার test run করলে 16 minutes and 40 second এর মত সময় লাগবে । এটাকে fast করতে parallel ভাবে রান করলে অনেক fast test result পাওয়া যায়।

কিন্তু সমস্যা হল একবার socket এ serve করার জন্য bind হয়ে থাকলে আরেকটা process তো ঐ port এ bind হতে পারে না । হুম...। কি করার ?

Well, operating system এ একটা solution আছে । আপনি যদি PORT 0 (zero) তে bind করেন তাহলে OS একটা available port খুঁজে assign করে।

পুরানো আরেকটা app এ ও ব্যবহার করেছিলাম

// config

let config = {
    let mut config = get_configuration().expect("could not load config");

    config.application.port = 0; // Assign port 0
        
    config
};

let app = Application::build(&config)
    .await
    .expect("failed to build application.");

let port = app.port();

let address = format!("http://localhost:{}",port);

let _ = tokio::spawn(app.run_until_stopped());

let db_pool = get_connection_pool(&config.database);

println!("address is {}",address);

and telling TCP to use this port,

let address = format!("{}:{}",&config.application.host,&config.application.port);

let listener = TcpListener::bind(&address)?;

let port = listener.local_addr().unwrap().port();

let server = run(listener, connection_pool, email_client, format!("{}",&config.application.base_url))?;

https://github.com/thearyanahmed/newsletter/ full source code.