DynamoDB

本来想写写进程、线程、轻量级线程、goroutine还有协程(coroutine),为什么我把goroutine单独列出来是因为它不是协程,所有翻译成协程的都是偷用概念,把比线程轻量的都叫做协程。算了,先不纠结这个,今天想写写DynamoDB,记录下经历。

就如官网描述到的,无限扩展,好吧,具体实现也不得而知,但这个无限扩展的前提是诸多限制。在确认DynamoDB是否适口你的项目使用的时候,记得多分析它的限制,否则迟早会成为项目的瓶颈,或者减缓业务的开发。

首先,DynamoDB统计不友好,想统计它的东西?最好还是放弃这个念头,扫描一遍的代价大得不可思议。在用DynamoDB之前,先弄好你的日志系统。

其次,它不是缓存,虽然是说SSD搞的,但是连这个东西(HTTPS)的代价不是普通缓存所会做的,就它内部查询性能来看,也是几十上百毫秒级别的。

再次,不要以为这个东西很容易用,各种SDK各种坑,拿python boto为例子,两个版本的实现,各自残缺,有些功能SDK根本提供不了,你要做好写RESTful requests的准备。

最后,你要是会看英文且真的想用DynamoDB就别继续往下看了,直接看官网文档各种详尽和指引,以下只是个人心得和坑的摘录。

第一个坑是数据类型,嗯,不完全符合JSON,也就是说,这个要做点格式转换,前不久才出了List和Map的支持,叫文档类型,官方建议可以把JSON压缩成Binary,这...。一条项目(就是一条record,叫item)最大存储容量为400KB(只是英文文档这样写,中文文档还没更新,依然写着64K,这有点小,除此以外,中文文档残缺不全,不值一嗔),这个还可以。读/写流量限制预设(Provisioned Throughput)是一个最大的坑,以流量限定读写速率和容量。单个读单位可在1秒内读1次且4KB以内的内容,40KB就要10个读单位,同样地,单个写单位每秒可写入1次且1KB以内内容。

第二个坑来了,就是这个读/写流量限制预设,全局二级索引是和主表分开预设流量计算。最坑在于,倘若你想写入主表,主表的预设流量是够的而全局二级索引预设流量不够,这样就会插不进,报错,这样使得全局二级索引和新建一张表无异,新建一张表还更灵活。预设流量的另一个坑是,你的hashkey(整个数据库以hashkey作为主键,不知道的请到官网中文版补习)必须hash得均匀才能得到预设流量的最大效用。比如说,你预设了1000个读(预设读容量超过10000还需要递表申请),amazon帮你自动分在20个区存放,那么你每个区只会获得50个读的流量,假如你现在急着要读某一类别的数据,并且这一类别的不小心集中在某一区域,不好意思,你的消费将乘以个几倍几十倍(amazon的服务本身就贵)。如果你要强一致性读(默认是不强一致性读的,不懂的自己脑补),那么将会消耗两倍于脏读的读单位。

第三大坑是索引,上面说到的全局索引是一个坑,还有一种叫二级本地索引也是一个坑,它居然有一条单个hashkey索引内容不超过10G的规定,这个索引内容投影属性*(这个概念请看官网)。这就是说,当你索引加投影单个item有200个字节(200个字节真心不多吧,一个uuid随便都32byte了,当然,你可以选择压缩...),200字节的情况下,该hashkey最多可以包含的条目是5000万条,这个规定直接给人限死了,你不能拿单个hashkey来玩,更别做太多投影。此外,索引是不能添加修改删除的,只能跟随表创建时添加。虽然有10G这个限定,但我觉得它的RangeKey和本地二级索引还是比较独特的,可以解决很大一部分的需求。前提是,最深的索引就是二级,你要做三级四级的索引就要想一下办法了,这个想一下办法也可以再解决一大部分的需求吧。

第四,别考虑太多事务啊原子操作之类,它做不了,简单的自增还是可以的。

最后就是SDK,如果你只是简单的使用,python的SDK boto没什么大问题,但你考虑到并发冲突,部分属性修改兼上是否覆盖写入等等的问题的时候,boto压根就不能解决,这就需要又花费一大块精力去手工Restful了,当然,如果你想用上tonado,没有现成的异步模块可用。

如果你已经跳过上述的坑,相信离DynamoDB符合你的项目需求已经不远了,当然,性能方面我还没做过多测试,准备上线亿级以上条目的项目了,详情敬请期待。

时间: 2024-12-13 14:55:48

DynamoDB的相关文章

golang DynamoDB sdk AccessDeniedException

golang调用aws sdk时候提示: AccessDeniedException: User: arn:aws:sts::818539432014:assumed-role/bj-develop/i-787f1cdc is not authorized to perform: dynamodb:PutItem on resource: arn:aws:dynamodb:xxx:818539432014:table/tablename_test status code: 400, reques

Amazon DynamoDB, 面向互联网应用的高性能、可扩展的NoSQL数据库

DynamoDB是一款全面托管的NoSQL数据库服务.客户能够很easy地使用DynamoDB的服务.同一时候享受到高性能,海量扩展性和数据的持久性保护. DynamoDB数据库是Amazon在2012年1月18日公布的. 它融入了亚马逊在大规模非关系型数据库和云计算领域积累的多年丰富经验.事实上早在2007年.亚马逊就以前公布了一篇论文.深入讨论了AmazonDynamo所使用的设计理念和实现技术,而且讨论了怎样在大规模扩展的同一时候提供高可靠的数据保护的问题. 最初的Dynamo设计基于一系

从S3中导入数据到Dynamodb

本节如果你已经从Dynamodb中导出过数据,而且导出的文件以及被存入S3.文件内部结构会在Verify Data Export File 中描写叙述. 我们称之前导出数据的原始表为source table,数据将要被导入的表为destination table.你能够将S3中的导出文件导入到dynamodb的表中.可是要先确保满足以下条件: The destination table 已经存在. (导入任务不会为你创建表) The destination table 与 source tabl

利用 Amazon DynamoDB 助力游戏应用

Amazon DynamoDB正迅速成为世界上发展势头最强劲的游戏数据库.<水果忍者>(由Halfbrick工作室开发).<战斗营地>(由PennyPop开发)等游戏都充分利用AmazonDynamoDB的一键式扩展性功能,支撑游戏高速的发展,为全球数百万玩家提供服务.AmazonDynamoDB还得到包括Supervillain工作室在内的众多开发人员的赞赏,该工作室的知名作品包括<塔炮战争>与<特隆:进化>. 在今天的文章中,大家将了解Amazon Dy

python--boto3 之 与dynamoDB 的基本交互,表的备份与恢复

参考资料:http://boto3.readthedocs.io/en/latest/reference/services/dynamodb.html 最近因工作需要,研究了一下boto3中dynamoDB部分,略有心得,在此总结一下. 首先是boto3的安装,在装有python和pip的机器上,运行 sudo pip install boto3 官网文档里,boto3提供的与dynamoDB交互的接口有以下几种: batch_get_item() batch_write_item() can_

[转]Amazon DynamoDB – a Fast and Scalable NoSQL Database Service Designed for Internet Scale Applications

This article is from blog of Amazon CTO Werner Vogels. -------------------- Today is a very exciting day as we release Amazon DynamoDB, a fast, highly reliable and cost-effective NoSQL database service designed for internet scale applications. Dynamo

Amazon DynamoDB 设计思想(零)

今天我们来看看DynamoDb的设计思想. DynamoDB主要是想要达到高可用性(availability),因为CAP理论,所以只能牺牲一致性了,但是会实现最终一致性.另外还想要达到高可扩展性(scalability)这个目标,方便进行水平扩展,也就是说高可用性和高可扩展性是DynamoDB要达到的两个目标,因为是分布式系统,所以需要对待失效处理向对待正常情况一样. DynamoDB也不例外的利用了一致性哈希(consistent hashing)来对数据进行分区和复制.它的数据一致性是利用

Amazon DynamoDB简介(一)

DynamoDB的数据是存储在SSD(Solid State Drive,固态硬盘),这样可在预测的低延迟响应时间之内,存储和访问任何规模的数据,另外SSD 还具有很高的 I/O 性能,能够处理大规模请求工作负载.我们来看看DynamoDB的不适合的使用场景:如果需要存储大量数据,但这些数据的访问频率很低,则 DynamoDB 可能不太适合. DynamoDb的数据模型是无模式的,可认为是简单的key-value模式.不过特殊之处在于它的主键可以是单属性的哈希键或复合的哈希-范围键.例如,单属性

Amazon DynamoDB 简介(二)

在DynamoDB中,database是table的集合,table是item的集合,item是attribute的集合.attribute是name-value对.value可以是单值属性也可以是多值属性(集合).一个item的大小不能超过64KB.理解了这个你就入门了. 另外,DynamoDB为了支持更为丰富的查询,提出了二级索引的思想,可以在表中创建一个或多个二级索引,并对这些索引发出 Query 请求.有两种类型的二级索引: 本地二级索引(Local Secondary Indexes)