Sou novo no Rust & Axum e estou tentando entender como configurar uma arquitetura escalonável e limpa. Ao executar localmente, às vezes noto um atraso antes da resposta chegar. Isso pode ter vários motivos, mas uma coisa que estou investigando é como estou compartilhando meu pool de conexões.
Este é o principal.rs
#[tokio::main]
async fn main() -> Result<(), Box<dyn error::Error>> {
let db_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set");
let pool = PgPool::connect(&db_url).await.expect("Failed to connect to database");
let repository_organization = PostgresRepositoryOrganization::new(pool.clone());
let service_organization = OrganizationService::new(Arc::new(repository_organization));
let app = Router::new()
.nest(
"/organizations",
Router::new()
.route("/", post(controller_organization::create_organization))
.layer(from_fn(authenticated_user::auth_middleware)),
)
.layer(Extension(service_organization))
let addr = SocketAddr::from(([0, 0, 0, 0], 3000));
let listener = tokio::net::TcpListener::bind(&addr).await.unwrap();
axum::serve(listener, app).await.unwrap();
Ok(())
}
No meu aplicativo de produção, eu teria muitos controladores e serviços. Muitas vezes vejo propriedade compartilhada tratada com um Arc
ponteiro Mutex
inteligente, mas não tenho certeza se isso é apropriado.
Há alguém aqui capaz de me dizer se essa abordagem está correta ou apresenta efeitos colaterais desconhecidos para mim?
Supondo que você
PgPool
seja do sqlx, ele diz:Portanto, não deve haver nenhum problema com isso: o objeto público
Pool
é um wrapper em tornoArc
do conjunto real de conexões :Uma possibilidade pode ser que você não tenha um número mínimo de conexões no pool (não sei como o sqlx é padrão), então o pool espera até a primeira solicitação para realmente se conectar ao banco de dados, o que causa algum atraso para o primeiro cliente.
Embora você também compile no
release
modo? A compilação na depuração é mais rápida, mas o programa pode ser muito mais lento, e isso pode explicar o atraso que você está vendo.Sim, está tudo bem, e geralmente é recomendado, clonar a conexão / pool de conexões do banco de dados no Rust. Porque você está lidando com uma referência, não com o objeto em si.