fn worker_entrypoint(mut rx: Receiver<TcpStream>) { let runtime = tokio::runtime::Builder::new_current_thread() .enable_all() .build() .unwrap(); runtime.block_on(async move { // We build a new Axum app on every worker, ensuring that workers are independent. let app = Router::new().route("/check", post(check)); let service_factory = app.into_make_service_with_connect_info::<SocketAddr>(); while let Some(stream) = rx.recv().await { let peer_addr = stream.peer_addr().unwrap(); // For each connection, we spawn a new task to handle it. tokio::spawn({ let mut service_factory = service_factory.clone(); async move { let service = service_factory.call(peer_addr).await.unwrap(); let hyper_service = TowerToHyperService::new(service); let http = hyper::server::conn::http1::Builder::new(); // We do not care if the request handling succeeds or fails, so ignore result. _ = http .serve_connection(TokioIo::new(stream), hyper_service) .await; } }); } }); }