Rust中的後臺作業 - kerkour

banq發表於2022-03-03

對於經常性工作(又名 CRON 工作),我個人使用lightspeed_scheduler

 let job = Job::new("kernel", "dispatch_delete_old_data", Some(3), move || {
      let kernel_service_inner = kernel_service.clone();
      Box::pin(async move {
          kernel_service_inner.dispatch_delete_old_data().await?;
          Ok(())
      })
  });
  scheduler
      .add_job_with_scheduler(
          "* 0 4 * * *"
              .to_scheduler()
              .expect("scheduler.run: parsing kernel.delete_old_data cron expression"),
          job,
      )
      .await;

  info!("scheduler.run: Starting scheduler.");
  scheduler.run().await?.await?;


tokio-cron-scheduler是一個很好的(也許更簡單)的替代方案。

 let mut scheduler = JobScheduler::new();

  scheduler.add(Job::new("1/10 * * * * *", |uuid, l| {
      println!("I run every 10 seconds");
  }).expect("defining 10 seeconds job"));

  scheduler.add(Job::new_async("1/7 * * * * *", |uuid, l| Box::pin( async {
      println!("I run async every 7 seconds");
  })).expect("defining 7 seeconds job"));

  scheduler.start().await;


 

一次性後臺作業
對於一次性的後臺工作,例如傳送事務性電子郵件,我們需要一個佇列。

我已經在如何使用 Rust 和 PostgreSQL 構建作業佇列中討論了這個主題,我仍然強烈推薦這個解決方案,因為它的操作簡單性和效能都很好!

// queue job
  let job = Message::SendSignInEmail {
      email: "your@email.com".to_string(),
      name: "Sylvain Kerkour".to_string(),
      code: "000-000".to_string(),
  };
  let _ = queue.push(job, Some(Utc::now())).await?;



 

相關文章