#分布式锁 #DynamoDB #并发 #支持 #语义 #写入 #S3

dynamodb_lock

基于Dynamodb的分布式锁

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数据库接口

Download history 1504/week @ 2024-03-14 1492/week @ 2024-03-21 1425/week @ 2024-03-28 1250/week @ 2024-04-04 1575/week @ 2024-04-11 648/week @ 2024-04-18 701/week @ 2024-04-25 626/week @ 2024-05-02 581/week @ 2024-05-09 636/week @ 2024-05-16 556/week @ 2024-05-23 578/week @ 2024-05-30 622/week @ 2024-06-06 643/week @ 2024-06-13 873/week @ 2024-06-20 294/week @ 2024-06-27

每月2,509次下载

Apache-2.0

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