好吧,我之前使用AWS Lambda构建了一个无服务器应用程序。我目前的申请流程如下:
API Gateway (1) → Lambda Function (2) → SQS (3) → Lambda Function (4) → DynamoDB (5)
现在,有一些注意事项:
当我第一次对这个流程进行原型化时,我有一个假设:向SQS发送消息比在DynamoDB上插入消息要快。但是,我从来没有做过真正的基准,也没有这样的事情,所以我的推测只是随意的。
问题是,最后:哪一项行动更快?发送已处理的请求是执行SQS还是直接发送到DynamoDB?
考虑到,在这两种情况下,它都将从lambda函数(2)中执行,因此,由于它与AWS本身处于相同的上下文中,因此它不会具有与从其他机器请求它相同的响应时间。 。
如果这个问题的答案是:
我可以删除SQS(3)和第二个lambda函数(4),从而产生更简单和更直接的流程。
但是,如果首先发送到SQS有更长的响应时间,我可以保持这种流量。
你问SQS是否比DynamoDB便宜,但在你的流程中你使用两者......当然,只做API Gateway (1) → Lambda Function (2) → DynamoDB (3)
会更便宜。
性能方面,众所周知,DynamoDB可以快速进行小型,频繁的写入,因此我不会担心这一点。
SQS和DynamoDB响应时间之间的差异应该非常相似,除非您的DynamoDB容量没有正确配置,在这种情况下您可能会遇到限制问题。如果您不关心预配置容量,那么我建议您在Lambda功能(或使用AWS X射线)内使用定时器测试SQS和DynamoDB,并确定性能差异是否值得添加SQS的成本和额外的Lambda函数
如果你在调用之间保持连接打开,我看到DynamoDB的响应时间低于10毫秒。我没有关于SQS延迟的数据。
关于成本,您基本上将您的lambda成本加倍,并添加任何SQS成本。如果使用按需写入,SQS的成本比DynamoDB高出约33%。
+1给Deiv和水泥块响应。
让我分享以下额外的观点,以帮助您改进您的拟议设计。
如果您需要严格遵守异步处理,即将请求处理与响应分离,那么请坚持使用基于SQS的解决方案。
如果请求处理延迟对于API端点的使用者来说是一致且可接受的,那么我建议Diev建议处理请求的解决方案,持久化到DynamoDB并将响应返回给客户端。作为奖励,您将获得较低的AWS账单(如上所述)。
DynamoDB旨在为单项读取提供“一致”P99(即第99百分位数)延迟<10 ms,对单项目写入提供<20 ms。
希望这可以帮助!