#dynamo-db #aws #key-value #interface #tiny #simpler #focused

tiny-dynamo

更小、更简单的针对AWS DynamoDB的关键值接口

2个版本

0.1.2 2021年8月24日
0.1.0 2021年8月23日

#12 in #focused

MIT 许可证

33KB
541

📦 🤏

tiny dynamo

更小、更简单的针对AWS DynamoDB的关键值接口

安装

要安装tiny dynamo,请在您的Cargo.toml文件中添加以下内容。

[dependencies]
tiny-dynamo = "0.1"

那么Tiny是什么?

Amazon DynamoDB是一种键值和文档数据库,在任何规模下都能提供单数毫秒级性能。

这句话直接来自Amazon DynamoDB文档。这种组合对其客户端API产生了一些影响,对于非常简单的键值应用来说,这些接口可能过于复杂,对于新手来说尤其如此。

Tiny Dynamo旨在利用DynamoDB的有用部分,如性能和可伸缩性,但提供一个更小、更简单的API,这可能是一个键值数据库所期望的。

使用

use std::{env, error::Error};
use tiny_dynamo::{reqwest_transport::Reqwest, Credentials, Table, DB};

fn main() -> Result<(), Box<dyn Error>> {
    let db = DB::new(
        Credentials::new(
            env::var("AWS_ACCESS_KEY_ID")?,
            env::var("AWS_SECRET_ACCESS_KEY")?,
        ),
        Table::new(
            "table-name",
            "key-attr-name",
            "value-attr-name",
            "us-east-1".parse()?,
            None
        ),
        Reqwest::new(),
    );

    println!("{:#?}", db.set("foo", "bar")?);
    println!("{:#?}", db.get("foo")?);

    Ok(())
}

将Tiny Dynamo与传统DynamoDB客户端进行比较时,有几个值得注意的差异是,此客户端假定一个单一表,这对于大多数DynamoDB应用来说是一个非常常见的用例,因此您只需使用该表名配置客户端,无需在每次请求中重复提供。

您还会发现接口已简化为get(key) set(key,value)。这是故意的,因为这个客户端主要专注于更适合简单键值应用。

功能

小巧

Tiny Dynamo避免了为简单键值应用不需要的任何内容打包行李。这包括整个SDK和一个临时的依赖项列表。这使得它更容易适应较小的空间,并实现Rust的零成本承诺,即不为您不使用的功能付费。

更简单的数据建模

在基于DynamoDB的应用程序中,一个常见的费力的活动是首先确定应用程序的数据模型,然后将其转换为DynamoDB的关键空间设计和属性类型目录。这对于需要更高级查询访问模式的应用程序来说是正常且预期的。对于简单的键值应用来说,这只是一项税收。Tiny DynamoDB假定键值数据模型。

仅数据平面

您可以将DynamoDB API理解为两个层面:一个是数据层面,处理数据传输等业务逻辑;另一个是控制层面,提供一组API来配置存储数据的资源。这两个层面的结合使得API的表面面积远远超出实际需求。Tiny Dynamo专注于仅暴露数据层面,以保持较小的学习面积。

无I/O

Tiny Dynamo采用sans I/O库的方法。它定义了一个Transport特质,允许任何I/O库实现请求如何在网络上传输,如果没有显式地开启cargo特性,则不提供任何实现。

以下是当前可用的cargo特性

reqwest

reqwest特性提供了一个用于发送请求的reqwest_transport::Reqwest后端,目前使用的是阻塞客户端。未来计划添加异步特性。

[dependencies]
tiny-dynamo = { version = "0.1", features = ["reqwest"]}

fastly

fastly特性提供了一个用于发送请求的fastly_transport::Fastly后端,适用于Fastly的Compute@Edge平台。

[dependencies]
tiny-dynamo = { version = "0.1", features = ["fastly"]}

BYOIO

如果您想使用自己的I/O实现,可以定义一个自定义类型的实现。

use tiny_dynamo::{Request, Transport};
use std::error::Error;

struct CustomIO;

impl Transport for CustomIO {
  fn send(&self, signed: Request) -> Result<(u16, String), Box<dyn Error>> {
    Ok(
      (200,"...".into())
    )
  }
}

Doug Tangren (softprops) 2021

依赖项

~3–18MB
~209K SLoC