apalis를 사용하여 Rust에서 cron 작업을 예약하고 실행하는 방법

8089 단어 tokiorust
이 자습서에서는 apalis을 사용하여 비동기 컨텍스트에서 cron 작업을 실행합니다. 또한 재시도, 프로메테우스, 센트리 등과 같은 기능을 잠금 해제할 수 있도록 하는 tower 미들웨어로 작업을 장식하는 방법도 살펴보겠습니다.

시작하려면 다음을 수행해야 합니다.

새 프로젝트 설정

cargo new my-cron-scheduler
cd my-cron-scheduler


Cargo.toml에 추가

[dependencies]
apalis = { version = "0.3", features = ["cron"] }
serde = { version = "1.0", features = ["derive"] }
tower = 0.4


이 자습서에서는 일일 알림 예제를 만듭니다.

use apalis::prelude::*;
use serde::{Serialize,Deserialize};

#[derive(Serialize, Deserialize, Default, Debug, Clone)]
struct Reminder;

// Define an apalis job
impl Job for Reminder {
    const NAME: &'static str = "reminder::DailyReminder";
}
// Define a handler
async fn send_reminder(job: Reminder, ctx: JobContext) {
    // Do reminder stuff
}


진입점을 정의하겠습니다.

use apalis::cron::{CronWorker, Schedule};
#[tokio::main]
async fn main() {
    // any valid cron string that points to the future should work
    let schedule = Schedule::from_str("@daily").unwrap();

    let worker = CronWorker::new(schedule, job_fn(send_reminder));

    Monitor::new()
        .register(worker)
        .run()
        .await
        .unwrap();
}


이것은 완벽하게 작동하지만 작업 컨텍스트에 대한 재시도 및 확장과 같은 기능을 더 추가할 수 있습니다.
apalis에서 이러한 기능을 사용하려면 retryextension 기능을 포함해야 합니다.

use apalis::layers::{Extension, DefaultRetryPolicy, RetryLayer};

#[derive(Clone)]
struct FakeService;

let service = ServiceBuilder::new()
    // Will retry 25 times
    .layer(RetryLayer::new(DefaultRetryPolicy))
    .layer(Extension(FakeService))
    .service(job_fn(send_reminder));

let worker = CronWorker::new(schedule, service);

Monitor::new()
    .register(worker)
    .run()
    .await
    .unwrap();



이제 핸들러에서 FakeService에 액세스할 수 있습니다.

// Define a handler
async fn send_reminder(job: Reminder, ctx: JobContext) {
    let fake_service = ctx.data_opt::<FakeService>();
    // fake_service.fetch_from_db()
}


다른 cron 작업에 대해 프로세스를 반복할 수 있습니다.

Monitor::new()
    .register(daily_worker)
    .register(weekly_worker)
    .run()
    .await
    .unwrap();


추가 정보:
Background job processing with rust using apalis, actix and redis
Apalis on Github

좋은 웹페이지 즐겨찾기