2个版本
0.1.2 | 2021年8月24日 |
---|---|
0.1.0 | 2021年8月23日 |
#12 in #focused
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