亚马逊网络服务 – 亚马逊Kinesis和AWS Lambda重试

我对亚马逊Kinesis很新,所以也许这只是我的理解中的一个问题,但在 AWS Lambda FAQ它说:

The Amazon Kinesis and DynamoDB Streams records sent to your AWS Lambda function are strictly serialized, per shard. This means that if you put two records in the same shard, Lambda guarantees that your Lambda function will be successfully invoked with the first record before it is invoked with the second record. If the invocation for one record times out, is throttled, or encounters any other error, Lambda will retry until it succeeds (or the record reaches its 24-hour expiration) before moving on to the next record. The ordering of records across different shards is not guaranteed, and processing of each shard happens in parallel.

我的问题是,如果由于某些原因导致一些生产者将碎片放在碎片上,当Lambda功能将其错误输出,然后不断重试时,会发生什么?这意味着该特定分片的处理将被错误阻止24小时.

最好的做法是通过将问题包装在自定义错误中来处理应用程序错误,并将此错误与所有成功处理的记录一起发送,并让消费者处理它?当然,这在一个不可恢复的错误的情况下仍然没有帮助,这个错误使程序像空指针那样崩溃:我们再次回到接下来的24小时的阻止重试循环.

不要超过它,Kinesis只是一个队列.您必须成功地使用记录(即,从队列中弹出)才能继续下一个记录.就像一个FIFO栈.

适当的做法应该是:

>从流中获取记录.
>在try-catch-finally块中处理它.
>如果记录处理成功,没问题. < - TRY
>但如果失败了,请注意另一个地方进行调查
为什么它失败了. < - CATCH
>在逻辑块的最后,始终坚持立场
DynamoDB. < - 最后
>如果系统发生内部错误(内存错误,硬件错误)
等等)这是另一个故事因为它可能会影响所有的处理
记录,不只一个.

顺便说一句,如果一个记录的处理需要1分钟以上,显然你做错了事情.由于Kinesis旨在每秒处理数千条记录,因此您不应该为每个记录处理这么长的工作.

你问的问题是队列系统的一般问题,有时被称为“有毒信息”.你必须在你的业务逻辑中处理它们才能安全.

http://www.cogin.com/articles/SurvivingPoisonMessages.php#PoisonMessages

相关文章
相关标签/搜索