我有些很好的消息要告诉 Amazon DynamoDB 用户。首先,DynamoDB Streams特性现在可用了,你今天就可以开始使用它了!正如你将从这篇博客帖中看到的,现在使用 AWS Lambda 处理一个数据流中的更改记录是非常简单的。其次,我们正在努力使你从一个DynamoDB表复制内容到另一个表变得真正简单,不管是跨域复制还是在一个域内部复制。
让我们深入了解一下吧!
DynamoDB Streams特性
去年秋季,就在 AWS re:Invent 大会开始前几天,我们在内部对DynamoDB Streams特性进行了试映。正如我当时写到的,我们开发了这一特性是因为很多AWS客户表达了他们的愿望,希望能够跟踪对DynamoDB表所做的更改。
现在DynamoDB Streams特性已经可以用于生产了。一旦你为一张表开启了这一特性,对这张表所做的所有更改(添加,更新和删除)都会被24小时滚动跟踪,并准实时地在一条stream record(流记录)中显示。多个流记录被分组在碎片中,并作为一个单元返回,以便进行更快更有效的处理。
对一条主键所做的一系列更改的相关排序将会被保存在一个碎片中。此外,一个特定的键值将会显示在特定时间点活跃的一组兄弟碎片中的至多一个碎片中。结果是,为了准确跟踪对一个项目所做的更改,你的代码只能处理一个碎片中的流记录。
你的代码可以检索碎片,循环访问这些记录,以任何希望的方式处理它们。你可以以表的配置写入能力的大约两倍的速率来检索记录。
你可以在调用CreateTable时,通过提供流规格参数,在表创建时就为表开启DynamoDB Streams特性。你也可以通过向UpdateTable提供相似的规格,为既存的表开启DynamoDB Streams特性。在上述任何一种情况下,规格都必须包括一个标记(指明启动或关闭特性)和一个查看类型(指明是仅存储和返回项目键值,仅存储和返回新映像,或存储和返回新旧映像)。
想要了解这一新特性的更多信息,请参阅新的 DynamoDB Streams Developer Guide (DynamoDB Streams开发指南)。
你可以免费创建DynamoDB Streams特性。你只需付费从Streams中读取数据。数据读取按照读取请求单元进行测量;对GetRecords的一次调用被计做一个请求单元,可以返回多达1MB的数据。想要获取更多信息,请参阅 DynamoDB Pricing (DynamoDB计价)页面。
DynamoDB Streams + Lambda =数据库触发器
AWS Lambda 使你能够在云中轻松地写入,承载和运行代码(目前只支持Node.js和Java代码),不用担心容错或规模伸缩,所有操作都是在很经济的基础上进行的(你只需按照运行代码所用的计算时间,以100毫秒的时间增量进行付费)。
作为今天发布的可用于生产的DynamoDB Streams特性的核心亮点,我们也正在努力使你轻松地使用Lambda处理流记录,而不需写很多代码或在你的表规模变大或操作增多时担心系统的规模。
你可以将Streams和Lambda的结合看做是实现数据库触发器的一个清洁和轻便的方式,NoSQL风格!以前,关系型数据库触发器在数据库引擎内实现。同样地,对操作的可能响应就局限于引擎所定义的所有操作。使用Lambda实施与触发器关联的动作(插入,删除和更改表项目)是更加强大,更具有表现力的。你可以写简单代码来分析这些更改(通过比较新旧项目映像),对其他格式的数据发起更新,实施业务规则,或激活同步或异步业务逻辑。你可以允许Lambda管理承载和伸缩业务以便你可以专注应用独特而有价值的部分。
完成准备工作后运行你自己的代码处理更改真的是很简单的。让我们使用一张新表来快速演练一下。为Lambda创建一个调用角色(以便Lambda可以代表我访问DynamoDB)后,我打开Lambda Console,点击Create a Lambda function。然后我选择标记有dynamodb-process-stream的蓝图:
每一个蓝图都配置了一个事件源和Lambda功能框架,以便你开始。Console提醒我配置事件源。我将它连接到一张DynamoDB表(user_table),指明我的代码一批可以处理多达100条流记录,并且指明我想处理新记录(我也可以选择处理既存记录,可处理的既存记录的范围可追溯到该数据流的时间范围):
该蓝图包含一个可以立即用于测试的功能;我只是赋予了它一个名称(ProcessUserTableRecords)并选择了一个IAM角色以便该功能可以访问DynamoDB:
现在我就来确认我的目标。我将会激活事件源(在实际开发中,你可能想要推迟这一步直到你编写并测试代码之后):
点击Create function将会创建该功能并使用表的更新流作为一个事件源。我可以在Lambda Console的Event sources页签看到该事件源和其他事件源的状态:
好了,我已经一切设置完毕。到现在我启动了一项功能,该功能与我的表中的更新流相连接,并做好了处理记录的准备!为了测试这一功能,我切换到DynamoDB Console,向表中插入了几个项目以便在流中生成某些活动:
然后我返回到Lambda Console(当然,浏览器页签使页签切换变得非常简单),验证一切是否如预期一样运行良好。快速浏览Monitoring页签后,我确认该功能运行了两次,并没有明显错误:
结果看起来很好,所以我检查该功能的CloudWatch Logs(CloudWatch逻辑)来了解更多信息:
如果我是在创建一个真正的应用的话,我可以从蓝图提供的代码开始,从那里添加更多的功能。
AWS客户 Mapbox 已经开始使用DynamoDB Streams和Lambda了,看看它们的新博客贴 Scaling the Mapbox Infrastructure with DynamoDB Streams (使用DynamoDB Streams特性伸缩Mapbox基础设施)。
想要了解如何同时使用DynamoDB和Lambda的更多信息,请阅读关于 Using DynamoDB Streams and AWS Lambda (使用DynamoDB Streams和AWS Lambda)的文档。使用DynamoDB Triggers不会收取费用;你只是为执行Lambda功能支付通常的费率(想要获取更多信息,请参阅Lambda Pricing页面)。
我相信,这一新特性将会使你的应用更简单,更强大,响应性更强。请让我知道你使用这一特性构建的应用!
DynamoDB跨域复制
作为DynamoDB Streams新特性的使用案例,我们也正在为DynamoDB发布一个新的跨域复制应用。该应用利用我们去年发布的 DynamoDB Cross Region Replication library (DynamoDB 跨域复制知识库,当然你也可以使用该知识库作为你应用的一部分)。
你可以出于若干个不同的原因使用复制功能跨域复制DynamoDB数据,包括容灾和从多个位置实现低时延访问。正如你将看到的,该应用使你轻松地设置和维护复制副本。
该应用运行在 AWS Elastic Beanstalk 上,利用 Amazon EC2 Container Service (亚马逊EC2容器业务),所有这些都是通过 AWS CloudFormation 模板发起。
你可以从DynamoDB Console内部开始发起流程。CloudFormation将会提醒你输入它创建堆栈和容器所需拥有的信息:
赋予堆栈(模板所发起的AWS资源组的总称)一个名称,然后点击Next。然后输入参数(你可以保存大多数参数的默认值):
Metadata表包含复制程序需要了解的待复制的表的范围和复制副本存储位置信息。在发起复制应用后,你可以访问它的在线配置页面(CloudFormation将会生成一个URL)进行设置:
你可以免费使用该特性。但你必须为你使用的资源付费。这些资源包括为表副本所配置的吞吐和存储,域间数据传输,从Streams中读取数据,EC2实例,用于控制应用的SQS队列。想要了解更多信息,请参阅 DynamoDB Pricing 页面。
想要了解设置信息,请参阅 Cross Region Replication (跨域复制)。
原文链接: https://aws.amazon.com/cn/blogs/aws/dynamodb-update-triggers-streams-lambda-cross-region-replication-app/?sc_campaign=launch&sc_category=cross_region&sc_channel=SM&sc_content=streamsga&sc_detail=std&sc_medium=aws&sc_publisher=tw_go活动推荐:08月27日 AWS 云计算环境中的Microservices 架构
( 翻译/吕冬梅 责编/王鑫贺 )
订阅“AWS中文技术社区”微信公众号,实时掌握AWS技术及产品消息!
AWS中文技术社区为广大开发者提供了一个Amazon Web Service技术交流平台 ,推送AWS最新资讯、技术视频、技术文档、精彩技术博文等相关精彩内容,更有AWS社区专家与您直接沟通交流!快加入AWS中文技术社区,更快更好的了解AWS云计算技术。