Rust中的后台作业 - kerkour


对于经常性工作(又名 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?;