当前位置: 首页 > 知识库问答 >
问题:

AWS Lambda是否严格按顺序处理DynamoDB流事件?

伏星汉
2023-03-14

我正在编写一个Lambda函数,用于处理DynamoDB流中的项。

我认为Lambda背后的部分观点是,如果我有一个大的事件突发,它将启动足够多的实例来同时通过它们,而不是通过单个实例顺序地提供它们。只要两个事件具有不同的键,我就可以不按顺序处理它们。

然而,我刚刚阅读了关于了解重试行为的这一页,上面说:

对于基于流的事件源(Amazon Kinesis Data Streams和DynamoDB流),AWS Lambda会轮询您的流并调用您的Lambda函数。因此,如果Lambda函数失败,AWS Lambda会尝试处理出错的记录批次,直到数据过期,对于Amazon Kinesis Data Streams来说,这可能长达七天。异常被视为阻塞,AWS Lambda不会从流中读取任何新记录,直到失败的记录批次过期或处理成功。这确保AWS Lambda按顺序处理流事件。

“AWS Lambda按顺序处理流事件”是否意味着Lambda不能同时处理多个事件?有没有办法让它同时处理来自不同键的事件?

共有2个答案

巫健柏
2023-03-14

流记录被组织成组或分片。

根据Lambda文档,并发是在shard级别实现的。在每个碎片中,流事件按顺序处理。

基于流的事件源:对于处理Kinisis或DynamoDB流的Lambda函数,碎片的数量是并发的单位。如果流中有100个活动碎片,则最多会同时运行100个Lambda函数调用。这是因为Lambda按顺序处理每个碎片的事件。

根据DynamoDB中的限制,

不允许两个以上的进程同时读取同一个DynamoDB流碎片。超过此限制可能会导致请求限制。

孟开宇
2023-03-14

使用AWS Lambda支持Kinesis和DynamoDB事件源的并行化因子,仍然可以保证每个分区键的顺序,但当每个分片的并发批次设置为大于1时,不一定在每个分片内。因此需要修改已接受的答案。

 类似资料:
  • 总之,我希望flatMap1()和flatMap2()按照我在事件中设置的时间戳的顺序被调用。但那不是真的。

  • 我每个websocket接收几十条消息,这些消息可能只差几毫秒就能到达。我需要用操作来处理这些数据,这些操作有时会花费一些时间(例如,在DB中的插入)。为了处理接收到的新消息,必须完成对前一个消息的处理。 我的第一个想法是用Node.js Bull(用Redis)准备一个队列,但恐怕太长了,无法运行。这些消息的处理必须保持快速。 我尝试使用JS迭代器/生成器(直到现在我还从未使用过),我测试了如下

  • 问题内容: 我认为使用某种顺序才有意义。我想做的是在视图中包括该子句,以便该视图上的所有s都可以忽略它。但是,我担心该订单不一定会延续到,因为它没有指定订单。 是否存在一种情况,即视图指定的顺序不会反映在该视图上的select结果中(该视图中的order by子句除外)? 问题答案: 您不能指望没有显式子句的任何查询中的行顺序。如果查询有序视图,但没有包括子句,则如果它们的顺序正确,请感到惊喜,并

  • 问题内容: Javadoc 表示(重点是我): 该操作的行为明确地是不确定的。 对于并行流管道,此操作不能保证遵守流的遇到顺序 ,因为这样做会牺牲并行性的好处。对于任何给定的元素,可以在库选择的任何时间和线程中执行操作。如果操作访问共享状态,则它负责提供所需的同步。 Java 9 Early Access Javadoc中提供了相同的文本。 第一句话(“明确地不确定”)表明(但未明确说明)此方法未

  • 的Javadoc表示(强调是我的): 此操作的行为显式不确定。对于并行流管道,此操作不能保证尊重流的相遇顺序,因为这样做会牺牲并行性的好处。对于任何给定的元素,操作可以在库选择的任何时间和线程中执行。如果操作访问共享状态,则它负责提供所需的同步。 同样的文本也出现在Java9早期访问Javadoc中。 如果forEach不保留遭遇顺序,则会引入bug。在报告针对NetBeans的bug之前,我想知