我想在 AWS 中创建一个由 SQS 事件触发的 Step Function。
SQS 中的事件有 2 种类型:
typeA
和 typeB
。 typeA
消息有一些 ID 和一个字段,其中包含预计到达的 typeB
消息数量。 typeB
有自己的ID和他的typeA Id
的父母。
这意味着类型之间存在某种关系:
typeA
是父级,typeB
是子级。
当
typeA
到达时,我想开始等待其所有子级到达,如果 1 小时内没有发生,则返回一些特定状态。
当
typeB
到达时,我想开始计算他的所有兄弟姐妹,并且只有当所有兄弟姐妹都到达时,才调用某个 Lambda 函数来根据 typeB
消息中的附加信息计算最终状态。
如何在不使用数据库的情况下实现这种等待非常具体的数据到达/从 SQS 获取的情况?也许 Step Functions 不是该架构的正确选择?
我尝试创建一些流程,但不知道如何对特定数据执行等待或事务的主要流程。
我认为 Amazon SQS 不适合您的架构。
从 Amazon SQS 队列检索消息时,无法“选择性”请求消息类型。相反,SQS 只是从队列中为您提供随机消息(好吧,不是完全随机的,但最好这样考虑它们)。因此,与
typeB
消息相比,无法知道队列中有多少 typeA
消息。
您可以创建两个独立的 SQS 队列——一个用于
typeA
,另一个用于 typeB
。但是,您仍然无法知道特定 typeB
父 ID 的队列中存在多少 typeA
消息。因此,如果您的系统正在等待来自多个“父级”的消息,那么您将不知道队列何时具有特定父级所需的消息数量。
相反,您的系统需要从 SQS 队列中检索消息并将它们存储在某处,同时等待最终处理它们的条件。 “某处”可以是数据库(例如 DynamoDB),甚至是 Amazon S3(也可以被视为 NoSQL 数据库)。例如,消息可以存储在 S3 中基于“父”ID 的目录中。每次消息到达并存储在 S3 中时,Lambda 函数都可以计算该目录中存储的消息数量。如果计数满足要求的总数,则可以触发最终处理。