【问题标题】:Should I care about dynamodb stream shards if I process stream events by lambda?如果我通过 lambda 处理流事件,我应该关心 dynamodb 流分片吗?
【发布时间】:2017-10-01 14:41:28
【问题描述】:

dynamodb documentation 表示有分片,需要先迭代,然后对每个分片获取记录数。

文档还说:

(如果您使用 DynamoDB Streams Kinesis Adapter,这将为您处理:您的应用程序将以正确的顺序处理分片和流记录,并自动处理新的或过期的分片,以及在应用程序中拆分的分片正在运行。有关更多信息,请参阅使用 DynamoDB Streams Kinesis Adapter 处理流记录。)

好的,但是我使用 lambda 而不是 kinesis(它们彼此相关吗?),如果 lambda 函数附加到 dynamodb 流,我应该关心碎片吗?或者我应该只编写 labda 代码并期望 aws 环境只将一些记录传递给那个 lambda?

【问题讨论】:

    标签: java amazon-web-services lambda amazon-dynamodb amazon-dynamodb-streams


    【解决方案1】:

    当使用 Lambda 使用 DynamoDB 流时,轮询 API 和跟踪分片的工作都会自动为您处理。如果您的表有多个分片,那么将调用多个 Lambda 函数。从您作为开发人员的角度来看,您只需为您的 Lambda 函数编写代码,其余的由您负责。

    DynamoDB 流仍然保证按顺序处理,因此对于单个分片,一次只会调用您的 Lambda 函数的一个实例。但是,对于多个分片,您可能会看到 Lambda 函数的多个实例同时运行。这种扇出是透明的,如果您在编写 Lambda 函数时没有意识到这一点,可能会导致问题或导致令人惊讶的行为。

    要更深入地了解其工作原理,我建议您观看 YouTube 视频 AWS re:Invent 2016: Real-time Data Processing Using AWS Lambda (SVR301)。虽然重点主要放在 Kinesis Streams 上,但使用 DynamoDB Streams 的相同概念也适用,因为技术几乎相同。

    【讨论】:

    • 是否可以强制创建更多分片?我在流数据方面遇到了一个主要的吞吐量问题。我可以将大量数据写入表中,但与我写入表的速度相比,事件流的速度似乎相对较低。我的分区键本质上是一个随机的 uuid,所以我不确定如何让它有更多的分片。
    • 您可以暂时将写入扩展到非常高的水平以强制分区拆分,但请注意,这将影响读取和写入项目的能力,而不仅仅是流。您需要设置高于 3,000 次读取或 1,000 次写入以强制您的第一个分片一分为二。或者,如果执行的工作不高效,最好的做法是通过异步调用来扇出其他 Lambda 函数。
    • 谢谢,这有帮助。我认为实际数字有点不透明。我在这张桌子上使用了自动缩放,但实际上我可能只是手动将它调高,然后让它在病房后自动缩小。我正在考虑 lambda 扇出,但我有点害怕那里的无限循环。必须小心。我什至正在考虑将它们猛烈撞击到另一个我可以控制碎片的运动流中,比如手动将其设置为 16 或其他东西。现在我意识到我拥有的另一个 lambda 处理速度更快,所以我将首先尝试优化 lambda 中的实际代码。
    • 好吧,优化我的 lambda 似乎有很大帮助。我拿了 1000 个记录批次,然后将 1000 个项目发送到 CloudSearch。现在我将它分成 100 个组,然后并行发送到云搜索……现在它跟上了传入的写入。我没有意识到这一点,但显然 lambda 本身就是瓶颈。
    【解决方案2】:

    我们每天使用 DynamoDB 处理近十亿条记录,并自动使这些记录过期并发送到流。

    一切都由 AWS 负责,我们不需要做任何事情,除了配置流(您想要什么类型的图像)和添加触发器。

    我们所做的唯一微调是,

    当您获得更多数据时,我们只是增加了批处理大小以加快处理速度并减少调用 Lambda 次数的开销。

    如果您使用任何外部进程来迭代流,您可能需要这样做。

    参考:

    http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html

    希望对你有帮助。

    【讨论】:

    • 您使用的批量大小是多少?另外,表流对我来说似乎很慢,或者可能与单个分片挂钩,我怎样才能增加分片的数量以增加流调用的并行 lambda 的数量?
    • 我们的批量大小是 100。我们不对这些消息执行任何业务逻辑,而是使用它从那里分发。我看不到有一种方法可以从流中调用并行 lambda。
    猜你喜欢
    • 2019-08-22
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    相关资源
    最近更新 更多