我有些很好的消息要告诉 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: