aws api gateway lambda dynamoDB

11 篇文章 0 订阅

列一下最近看的一些比较厉害的现代技术,其实已经有了很长时间了,现在才看到:aws lambda(网站还需要这些资源 api gateway+dynamoDB+cloudFormation+SAM), github acitons(CI/CD). 这些让开发一个网站变得很容易,而且不需要专门去维护一台服务器,能以极低成本来验证idea.

最近在看AWS相关的服务,主要是serverless这一块的。看完aws的一些服务,感觉还是比较震撼的。首先,我们已经不需要服务器了,通过lambda写一个函数,然后用api gateway在外边加上生成一个url, 通过url的请求来触发lambda,并返回结果。其次是cloudFormation, 它实现了通过配置模板的方式来开启(安装)资源,比如S3, mysql, api gateway之类的资源配置。而且它可以通过代码版本控制的方式管理,可以批量多次复制,如果改错了还会自动回滚。当然,这个还是不太好写,关于serverless的模板,有专门的一套SAM来解决类似的问题。Cloud9是一个在线代码编写工具,当然这个是收费的。如果要使用sam, 可以使用sam自带的命令行,本地编写代码之后命令行上传代码部署。

这里说一下我对dynamoDB的理解,dynamoDB是一个nosql数据库,所以不能用结构化数据库的思维来使用它。主要解决了就是提高速度和扩大规模,不会因为数据增多或者扩展而出现性能问题。
我列一些我看到的目前我觉得比较重要的点:

dynamoDB的三个基本属性是表Tables,项目Items,属性Attributes。表和mysql的表是一样的。项目其实就对应mysql上面的一行数据。而项目,就是由一个多个属性构成的。

还有一些比较重要的点:主键,二级索引,事务
dynamoDB不支持多表联查。所以业务关系要设计到一张表当中。目前我知道的默认就是
分区键+排序键(PK,SK)这种就能处理目前已知的多业务类型。

如何挑选主键HASH?主键要尽可能的多而不重复,这样做的目的是为了一次查询的数据足够的准确,避免大量的请求而降低性能。
要做分片,在分区键值的末尾添加一个随机数。这样能提高写入,但是读取会很难。可能通过id计算后缀然后将其附加在分区键日期上,这样可以平均写入分区键值,而且也较容易取。

设计 DynamoDB 表的主键时,请牢记以下最佳实践:
  1. 从表中的不同实体开始。如果您要在一个表中存储多种不同类型的数据(例如员工、部门、客户和订单),请确保您的主键能够清楚地区分每个实体并对各个项目启用核心操作。
  2. 使用前缀来区分实体类型。使用前缀来区分实体类型可以防止冲突,同时有助于查询。如果“客户”和“员工”位于同一个表中,则“客户”的主键可以是 CUSTOMER#,而“员工”的主键则可以是 EMPLOYEE#。
  3. 首先重点关注单项目操作,然后添加多项目操作(如果可能的话)。对于主键,可以使用单项目 API(GetItem、PutItem、UpdateItem 和 DeleteItem)满足单个项目的读写选项要求很重要。如果您也可以使用 Query 满足主键的多项目读取模式,那再好不过了。如果不能,您随时可以添加二级索引来处理 Query 使用案例。

上面的是从官网抄下来的,我写一下我理解的,建模之前,是需要考虑访问模式的,必须预先了解业务问题和应用程序用例,然后分析日志找到关键访问的点。
在这里插入图片描述
比如上面这个图,前面的是主键,后面的范围键。根据业务类型来定义出这个表的过程是特别关键的,它直接决定了后续存取数据的效率。

二级索引可以建立很多(20个全局和5个本地),但是这里主要记录一下倒排索引。 如果默认的联合索引可以查看当前用户有关注了哪些人,倒排索引就可以查看当前用户被哪些人关注。二级索引分位两种,全局二级索引和本地二级索引,区别就是全局的索引和表的partition可能不一样,而本地的索引和表的partition是一致的,只是sort key 不一样。

还有一个DynamoDB Streams的概念,这个目前并不重要,就是可以捕获到有新数据录入/删除/修改的时候,执行特定的lambda 函数。比如客户表有新客户,自动发送一个电子邮件之类的。

mysql里面的外键的功能,dynamoDB里面就会比较麻烦。为了避免多次连接,可以用反标准化。它可以避免连接,可以提高查询性能,但是反标准化会让数据模型变得复杂,而且如果用户更改了某些数据,实体数据可能都会过时,每次有更新,都得更新受影响的实体。这种情况下,通过局部标准化和批量的查询方式BatchGetItem可以解决这个问题。

这里还要详细说一下上面的表,实体User对应的Hash里面,前面要用USER#拼接,这样是为了避免和其他的实体类型(Photo,Reaction)冲突。User和Photo设置一样的HASH,可以在取用户数据的同时,取到用户的照片。而Reaction之所以HASH没有和前面保持一致,是因为Reaction是和Photo进行绑定的,我们可以通过取指定RANGE, 即让Photo和Reaction保持一致,然后通过倒排索引,就可以实现根据RANGE找到特定的照片和照片对应的表态。同样,friendship是User与User之间的关系,所以HASH和之前的保持一致,即当前的用户,而range里面存放的是该用户的关注者。同样可以通过倒排索引实现关注者用户的关注的人的反查。

dynamoDB支持的一些数据类型:

The following is a complete list of DynamoDB data type descriptors:

S – String

N – Number

B – Binary

BOOL – Boolean

NULL – Null

M – Map

L – List

SS – String Set

NS – Number Set

BS – Binary Set

参考:

https://amazonaws-china.com/dynamodb/getting-started/
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html

dynamoDB权限处理
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/using-identity-based-policies.html

python dynamoDB+lambda+apigateway用例(需要调整template.yml)
https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-example-ddb.html

nodejs dynamoDB+api gateway+lambda用例(需要调整template.yml)
https://github.com/mavi888/sam-test-basic-project/blob/master/template.yml

cloudFormation关于dynamoDB方面的详细文档
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html

sam相关的:

Sam 简单的helloworld 用例
https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started-hello-world.html

测试环境
sam local invoke -e event.json hello [sourcename helloworld] # 名字

执行之后发现拉取docker镜像太慢了,需要配置一下源
https://www.jianshu.com/p/6351041399cd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值