5个版本
0.6.1 | 2023年11月12日 |
---|---|
0.6.0 | 2023年11月7日 |
0.4.3 | 2023年3月1日 |
0.4.2 | 2023年1月2日 |
0.4.1 | 2022年5月16日 |
#386 在 数据库接口
每月2,509次下载
43KB
696 代码行
dynamodb lock
使用纯Rust实现的基于Dynamodb的分布式锁。设计灵感主要来自 amazon-dynamodb-lock-client。
它被 delta-rs 项目用于实现并发S3写入的PUT if absence语义。它被认为已准备好生产环境,并通过 kafka-delta-ingest 项目进行实战测试。
使用方法
let region = dynamodb_lock::Region::default();
// This will use the default options
let lock_client = dynamodb_lock::DynamoDbLockClient::for_region(region);
let lock_data = "Moe";
let lock = lock_client.try_acquire_lock(Some(lock_data)).await?.unwrap();
if lock.acquired_expired_lock {
// error handling when acquired an expired lock
}
// do stuff in the critical region
lock_client.release_lock(&lock).await?;
对于真实世界的示例,请参阅 https://github.com/delta-io/delta-rs/blob/main/rust/src/storage/s3/mod.rs。
部署
使用DynamoDb锁需要已经在AWS中创建了一个DynamoDb表。以下Terraform代码是一个示例,它将创建名为"lock_example"的表。
resource "aws_dynamodb_table" "oxbow_locking" {
name = "lock_example"
billing_mode = "PROVISIONED"
# Default name of the partition key hard-coded in delta-rs
hash_key = "key"
read_capacity = 10
write_capacity = 10
attribute {
name = "key"
type = "S"
}
# The leaseDuration is used by dynamodb-lock-rs and *must* be a Number type
attribute {
name = "leaseDuration"
type = "N"
}
ttl {
attribute_name = "leaseDuration"
enabled = true
}
}
然后应使用环境变量 DYNAMO_LOCK_TABLE_NAME
设置为 "lock_example" 来配置锁定代码
依赖项
~10–26MB
~390K SLoC