#queue #persistent #async #task-queue

app-queue

应用内持久队列,用于异步任务

1 个不稳定版本

0.1.0 2024年5月5日

#1274 in 异步

Apache-2.0

38KB
166 代码行

App-Queue

App-Queue是一个简单的Rust应用内持久队列。它旨在嵌入到单体应用中,并为异步任务提供自动队列和重试功能。

此外,它允许使用任何可序列化的数据类型作为请求。

默认情况下,如果作业返回错误,它将使用指数退避(最长延迟600秒)无限期重试。但是,可以在每个作业类型的基础上覆盖此行为。

示例用法,来自文档

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MyJob {
    message: String
}

#[typetag::serde]
#[async_trait::async_trait]
impl Job for MyJob {
  async fn run(&mut self, _: Arc<AppQueue>) -> Result<()> {
    println!("{}", self.message);
    Ok(())
  }
}

#[tokio::main]
async fn main() -> Result<()> {
# tracing_subscriber::fmt::init();
  let queue = AppQueue::new("/tmp/queue.db").await?;
  let job = MyJob {
    message: "Hello, world!".into()
  };
  queue.add_job(Box::new(job)).await?;
  queue.run_job_workers_default();
  Ok(())
}

更详细的示例 可以在这里找到

注意事项

不兼容的模式更改(Job结构体的重命名/删除)以及作业本身结构的不兼容更改会导致作业在队列中卡住。这将在启动时显示错误,但在程序的其余运行时间内将被忽略。

限制

当前尚未支持的可能需要的特性

  • 在指定时间后运行作业(技术上可行,但尚无API)
  • 优先级
  • 与应用存储的集成。应用可能已经使用数据库,因此最好只有一个数据库。在某些情况下,适当的数据库管理系统也可能提高性能。

依赖项

~51MB
~885K SLoC