Crates.io | dynamodb_lock |
lib.rs | dynamodb_lock |
version | 0.6.1 |
source | src |
created_at | 2022-05-16 01:34:15.533302 |
updated_at | 2023-11-12 16:27:58.092581 |
description | Distributed lock backed by Dynamodb |
homepage | https://github.com/delta-incubator/dynamodb-lock-rs |
repository | |
max_upload_size | |
id | 587394 |
size | 84,938 |
Dynamodb based distributed lock implemented in pure Rust. The design is largely inspired by amazon-dynamodb-lock-client.
It is used by the delta-rs project to implement PUT if absence semantic for concurrent S3 writes. It is considered production ready and battle tested through the kafka-delta-ingest project.
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?;
For real world example, see https://github.com/delta-io/delta-rs/blob/main/rust/src/storage/s3/mod.rs.
Using the DynamoDb lock requires a DynamoDb table to have already been created in AWS. The following Terraform code is an example which will create table named "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
}
}
The locking code should then be configured with the environment variable
DYNAMO_LOCK_TABLE_NAME
set to "lock_example"