pub struct AppState {
    pub odsay:      services::odsay::OdsayService,
    pub routes:     services::routes::RoutesService,
    pub kakao:      services::kakao::KakaoService,
    pub congestion: services::congestion::CongestionService,
    pub cache:      services::cache::CacheService,
    pub seoul:      services::seoul::SeoulService,
}

So what: 모든 서비스를 하나의 구조체로 묵어 Actix 공유 상태로 관리한다

So why: Actix는 요청마다 새 스레드에서 핸들러를 실행한다. web::Data<AppState>로 등록하면 내부적으로 Arc로 모든 핸들러가 같은 서비스 인스턴스를 공유한다. 각 핸들러에서 서비스를 직접 생성하면 reqwest Client와 API키 초기화가 요청마다 반복하게 된다.

 

tokio::spawn(async move {
    consumer.run_background(cache_for_consumer).await;
});

tokio::spawn(async move {
    services::seoul::run_subway_producer(seoul_producer, kafka_producer).await;
});

So what: Consumer와 Producer를 메인 서버와 분리된 백그라운드 태스크로 실행한다

So why: 두 태스크는 무한 루프이다. 메인 스레드에서 실행할 경우 HttpServer::run()에 도달하지 못하고 tokio::spawn으로 독립 태스크로 분리하면 서버 요청 처리와 Kafka 파이프라인이 동시에 비동기로 동작할 수 있다.

 

 

 

 

'Project > SSAFY2학기 특화 PJT' 카테고리의 다른 글

AR 내부 회고  (0) 2026.03.31
[BE] route.rs ( 경로 )  (0) 2026.03.16
[BE] realtime.rs ( 실시간 데이터 )  (0) 2026.03.13
[BE] fare.rs ( 요금 정보 )  (0) 2026.03.13
[BE] cache.rs ( Valkey 연동 )  (0) 2026.03.13

+ Recent posts