AWS Lambda - 存储队列的状态

Pap*_*its 1 state amazon-s3 amazon-web-services amazon-dynamodb aws-lambda

我目前的任务是构建一个用于政府机构和公民之间通信的无服务器架构,主要组件是某种形式的队列,其中包含某种形式的指向每个公民请求的对象/指针,按优先级排序。然后,政府工作人员可以在可用时处理元素。由于 Lambda 是无状态的,我需要以某种方式将队列保存在外部。

为了保存状态,我收集到您可以使用 DynamoDB 或 S3 存储桶并使用事件触发器来调用相关的 Lambda 方法。有些还建议使用 Parameter Store 来保存一些状态变量。全局存储东西也出现了,尽管你不能保证 Lambda 不会终止,这似乎不是一个好主意。

最后,我还阅读了一些有关 SQS 的内容,尽管我不知道它是否适用于这种情况。

以这种方式使用 Lambda 时,最佳实践/建议方法是什么?由于事件触发,我倾向于 S3 Bucket,而不是使用 DynamoDB 作为我们的数据库。

Mic*_*bot 5

\n

全局存储东西也出现了,尽管你不能保证 Lambda 不会终止,这似乎不是一个好主意。

\n
\n\n

正确——这根本不可行。请注意,当您说“Lambda”时,您实际上指的是容器内的进程...并且任何时候您的 Lambda 函数同时处理多个调用时,您都可以保证它们不会在同一容器中运行容器——所以“全局”变量只对优化有用,对状态没有用。同一函数的任何两个并发调用都有两个完全不同的全局环境。

\n\n

暂时忘记 Lambda——我并不是说不要使用 Lambda;我只是说不要使用 Lambda。我是说,是否使用 Lambda 与下面所写的其余内容无关——我建议并行/并发操作通常可能是许多开发人员倾向于的最重要因素之一在尝试设计像您所描述的那样的东西时要忽略。

\n\n

如何从该工作“队列”中分配工作是需要考虑的极其重要的事情。您不能只是“找到下一个项目”并将其显示给工作人员。

\n\n

您必须有一种方法来完成所有这些事情:

\n\n
    \n
  • 查找下一个可用的项目
  • \n
  • 验证它确实可用
  • \n
  • 将其分配给特定的工人
  • \n
  • 将其标记为不可分配
  • \n
\n\n

不仅如此,您还必须能够以原子方式(作为单个逻辑操作)完成所有这些事情,并且不会发生冲突。

\n\n

na\xc3\xafve 实现存在将同一工作项分配给两个或更多人的风险,第一个任务会被几乎同时发生的后续任务盲目且默默地覆盖。

\n\n

DynamoDB 允许条件更新——当且仅当某个条件为真时才更新记录。这是您的解决方案需要适应的一项关键功能 - 例如,当且仅当项目 x 当前未分配时,才将工作项目 x 分配给用户 y。 如果更新发生时条件不成立,则有条件更新将失败,并且不会改变任何内容,这就是该功能的强大之处。

\n\n

S3 不支持条件更新,因为与 DynamoDB 不同,S3 在大多数情况下仅在最终一致性模型上运行。更新或删除 S3 中的对象后,无法保证对 S3 的下一个请求将返回最新版本,或者 S3 不会返回最近删除的项目。这不是 S3 的缺陷——而是一种优化——但它使得 S3 不适合“工作队列”方面。

\n\n

跳过这个考虑因素,您将拥有一个看起来可以工作并且在大部分时间都正常工作的系统……但在其他时候,它会“神秘地”表现错误。

\n\n

当然,如果您的工作项目有附带文档(扫描图像、PDF 等),那么将它们存储在 S3 中是完全正确的……但 S3 并不是存储“状态”的错误工具。出于同样的原因,SSM 参数存储是错误的工具——当两个操作都需要同时修改“状态”时,它们无法协同工作。

\n\n

当然,“事件触发器”很有用,但从您的描述来看,最值得注意的“事件”不是来自数据或工作项的创建,而是当工作人员说“我准备好了”时我的下一个工作项目。” 正是在这一点上——由网站/应用程序代码触发——执行上述步骤以选择一个项目并将其分配给工作人员。(实际上,这可能是浏览器 \xe2\x86\x92 API Gateway \xe2\x86\x92 Lambda)。根据您的描述,可能不需要创建新工作项来触发“事件”,或者即使有,它也不是事件中最重要的。

\n\n

为此,您将需要一个合适的数据库。DynamoDB 和 RDS 都是候选者。

\n\n

SQS 提供的队列旨在解耦应用程序的两个部分 - 当两个进程以不同的速度运行时,SQS 用作缓冲区,允许 X 安全地存储需要完成的工作,然后继续执行其他操作,直到 Y能够完成这项工作。SQS 队列是不透明的——您无法内省队列中的内容,您只需获取下一条消息并负责处理它。从表面上看,这似乎部分描述了您的需求,但它与此用例并不完全匹配。队列对消息可以保留的时间有限制,一旦消息被成功处理,它就完全消失了。

\n\n

另请注意,SQS 仅与启用了 FIFO 队列功能的用例相匹配,该功能保证完美的按序交付和一次性交付 - 标准 SQS 队列,出于性能优化的原因,不保证完美的按序交付并且在某些条件下可以向同一消费者或不同消费者多次传递相同的消息。但SQS FIFO队列功能不能与事件触发器共存,事件触发器需要标准队列。

\n\n

所以SQS可能有作用,但是你需要一个权威的数据库来存储工作和业务流程的结果。

\n