自动卸载 dynamo table 到云搜索域

Automatically offload dynamo table to cloud search domain

我正在大量使用 Dynamo DB 来构建我正在构建的服务。一个新的客户请求进来了,需要云搜索。我看到可以通过 AWS 控制台从 dynamo table 创建云搜索域。

我的问题是:

Is there a way to automatically offload data from a dynamo table into a cloud search domain via the API or otherwise at a specified time interval?

比起手动将 dynamo 文档卸载到 cloudsearch,我更喜欢这个。非常感谢所有帮助!

这里有两个想法。

  1. 使用 CloudSearch 搜索 DynamoDB 数据的 AWS 官方方式

    http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching-dynamodb-data.html 的 "Synchronizing a Search Domain with a DynamoDB Table" 部分对这种方法进行了非常详尽的描述。

    缺点是这听起来很痛苦:您必须重新创建新的搜索域或维护更新 table 才能同步,并且您需要一个 cron 作业或其他东西执行脚本。

  2. AWS Lambdas 方式

    使用新的 Lambdas 事件处理服务。基于 Dynamo 设置事件流非常简单(参见 http://docs.aws.amazon.com/lambda/latest/dg/wt-ddb.html)。

    然后,您的 Lambda 会根据 Dynamo 事件向 CloudSearch 提交搜索文档。有关从 Lambda 提交文档的示例,请参阅 https://gist.github.com/fzakaria/4f93a8dbf483695fb7d5

    我认为这种方法要好得多,因为它会在您不参与的情况下不断更新您的搜索索引。

我不太清楚 Lambda 如何始终使数据与 dynamoDB 中的数据保持同步。考虑以下流程:

  1. 应用程序更新 DynamoDB table 的记录 A(比如 A1)
  2. 紧接着,应用程序更新相同 table 的相同记录 A(到 A2)
  3. 1 的触发器导致 1 的 Lambda 开始执行
  4. 2 的触发器导致 2 的 Lambda 开始执行
  5. 第 4 步先完成,因此 CloudSearch 看到 A2
  6. 现在第 3 步完成,因此 CloudSearch 看到 A1

Lambda 触发器不保证仅在上一次调用完成后启动(如有错误请更正,并提供给我 link)

如我们所见,事情不同步了。

我认为最接近的方法是使用 AWS Kinesis Streams,但那些也使用单个碎片(1MB ps 限制摄取)。如果该限制有效,则可以编写您的消费者应用程序,以便首先按顺序处理记录,即只有在前一条记录放入 CS 之后,才应放入下一条记录。