⚠️ EXPERIMENTAL⚠️ This project is experimental and under active development. It is not recommended for production use. APIs may change without notice, and there may be bugs or missing features.
A MS-SQL/Azure SQL provider implementation for Duroxide, a durable task orchestration framework for Rust.
- ✅ Full implementation of
ProviderandProviderAdmintraits - ✅ T-SQL stored procedures for atomic operations
- ✅ Azure SQL and on-premise MS-SQL support
- ✅ Connection pooling via bb8 + tiberius
- ✅ Custom schema support for multi-tenant isolation
- ✅ Automatic schema migration on startup
- ✅ Poison message detection with attempt count tracking
- ✅ Lock renewal for long-running orchestrations and activities
Add to your Cargo.toml:
[dependencies]
duroxide-sql = { git = "https://github.com/affandar/duroxide-sql" }
duroxide = { git = "https://github.com/affandar/duroxide" }use duroxide_sql::MssqlProvider;
use duroxide::runtime::Runtime;
use std::sync::Arc;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// Create provider with connection string
let provider = MssqlProvider::new(
"server=tcp:myserver.database.windows.net,1433;database=mydb;user=myuser;password=mypass;encrypt=true"
).await?;
// Use with Duroxide runtime
let runtime = Runtime::start_with_store(
Arc::new(provider),
activity_registry,
orchestration_registry,
).await;
Ok(())
}For multi-tenant isolation or testing:
let provider = MssqlProvider::new_with_schema(
"server=tcp:myserver.database.windows.net,1433;database=mydb;user=myuser;password=mypass",
Some("my_schema"),
).await?;| Environment Variable | Description | Default |
|---|---|---|
DUROXIDE_SQL_POOL_MAX |
Maximum connection pool size | 10 |
Supports ADO.NET style connection strings:
server=tcp:hostname,port;database=dbname;user=username;password=secret;encrypt=true;trustservercertificate=false
This provider uses T-SQL stored procedures for all critical operations to ensure atomicity:
sp_fetch_orchestration_item- Fetch + lock orchestration turnsp_ack_orchestration_item- 9-step atomic commitsp_fetch_work_item- Fetch + lock activitysp_ack_worker- Delete + enqueue completion
See IMPLEMENTATION_PLAN.md for detailed architecture.
Run against Azure SQL:
export DATABASE_URL="server=tcp:myserver.database.windows.net,1433;database=mydb;user=myuser;password=mypass;encrypt=true"
cargo testMIT License - see LICENSE for details.