从一个 SQS 触发器触发多个 lambda 函数
Triggering multiple lambda functions from one SQS trigger
我不确定我是否正确理解 AWS Lambda - SQS 触发器。我是否可以将其配置为一个 SQS 队列可以根据消息正文或消息属性触发不同的 lambda 函数?
我的用例: 我有三个不同的 lambda 函数(processCricket、processFootball、processTennis),每个函数执行一个独特的函数。我有一个接收消息的队列(processGame)。队列中的每条消息都有一个属性 "type",它可以是 "Cricket"、"Football" 或 "Tennis"。我可以根据消息上的 "type" 调用不同的 lambda 函数吗?
选项 1: 配置 SQS 以根据类型触发不同的 lambda 函数(不确定我是否可以这样做)
方案2:配置一个lambda函数,可以检查类型,然后根据其类型调用其他lambda函数
选项 3: 为每个 lambda 创建单独的队列。通过将消息添加到适当的队列来控制哪个 lambda 处理消息。
Option 1: Configure SQS to trigger a different lambda function depending on the type
在被 lambda 消耗之前,您无法知道 type
。所以这个是不可能的。
Option 2: Configure one lambda function which can check type and then call the other lambda functions depending on its type
是的,这是第一个选项的"possible"方式。但它可能会花费 "more",具体取决于您的使用情况。当您以批处理模式使用 sq 时,您必须通过进行多次检查来调用多个 lambda。
Option 3: Create separate queues for each lambda. Control which lambda processes the message by adding the message to the appropriate queue.
在我看来,这可能是最好的选择。您可以为每个队列配置不同的DLQ,根据您的业务规则设置不同的batch size,不需要额外的lambda来增加"complexity".
您应该而不是将多个 Lambda 函数配置为单个 SQS 队列的触发器。这是因为 SQS 中的消息将传递给任何一个消费者,并且当该消费者正在处理此消息时,其他人将看不到它。因此,您将无法决定哪个 "type" 消息发送给哪个函数,因此 选项 1 无效。
选项 2 和 3 都应该可以正常工作。我会 select 选项 2 如果您不希望有那么多消息被传送到您的队列,因此不必担心 Lambda scaling。另请注意,多条消息可以在一个批次中传送到 Lambda 触发器,因此您必须相应地实现您的逻辑。
如果您希望收到大量消息,那么选项 3 更适合。
您可能应该 post 到一个 SNS 主题,并让多个 lambda 订阅该主题并根据需要处理事件。
这里最好的选择是根本不将消息直接发送到队列。您可以使用 SNS 或 EventBridge 作为消息的目的地。然后你应该为每种类型的消息有一个队列。然后,您可以将每个队列订阅到源(SNS 或 EventBridge),并且只接收对该队列有意义的消息。使用 EventBridge,您可以对整个负载进行大量过滤。对于 SNS,您需要将类型添加到属性中,以便它可以用于过滤。
使用不同的订阅过滤器订阅 SNS 的多个 lambda 在这里看起来是最好的选择。
好处。
- 需要管理的最低基础设施。
- 订阅者(Lambdas)在收到消息后不用担心过滤问题,每个lambda会根据订阅过滤器中给定的条件得到特定的消息进行处理。
- SNS 将根据订阅过滤器处理路由部分。
您需要注意的唯一一点是使消息中的类型字段可用 Headers 以应用于订阅过滤器。
我不确定我是否正确理解 AWS Lambda - SQS 触发器。我是否可以将其配置为一个 SQS 队列可以根据消息正文或消息属性触发不同的 lambda 函数?
我的用例: 我有三个不同的 lambda 函数(processCricket、processFootball、processTennis),每个函数执行一个独特的函数。我有一个接收消息的队列(processGame)。队列中的每条消息都有一个属性 "type",它可以是 "Cricket"、"Football" 或 "Tennis"。我可以根据消息上的 "type" 调用不同的 lambda 函数吗?
选项 1: 配置 SQS 以根据类型触发不同的 lambda 函数(不确定我是否可以这样做)
方案2:配置一个lambda函数,可以检查类型,然后根据其类型调用其他lambda函数
选项 3: 为每个 lambda 创建单独的队列。通过将消息添加到适当的队列来控制哪个 lambda 处理消息。
Option 1: Configure SQS to trigger a different lambda function depending on the type
在被 lambda 消耗之前,您无法知道 type
。所以这个是不可能的。
Option 2: Configure one lambda function which can check type and then call the other lambda functions depending on its type
是的,这是第一个选项的"possible"方式。但它可能会花费 "more",具体取决于您的使用情况。当您以批处理模式使用 sq 时,您必须通过进行多次检查来调用多个 lambda。
Option 3: Create separate queues for each lambda. Control which lambda processes the message by adding the message to the appropriate queue.
在我看来,这可能是最好的选择。您可以为每个队列配置不同的DLQ,根据您的业务规则设置不同的batch size,不需要额外的lambda来增加"complexity".
您应该而不是将多个 Lambda 函数配置为单个 SQS 队列的触发器。这是因为 SQS 中的消息将传递给任何一个消费者,并且当该消费者正在处理此消息时,其他人将看不到它。因此,您将无法决定哪个 "type" 消息发送给哪个函数,因此 选项 1 无效。
选项 2 和 3 都应该可以正常工作。我会 select 选项 2 如果您不希望有那么多消息被传送到您的队列,因此不必担心 Lambda scaling。另请注意,多条消息可以在一个批次中传送到 Lambda 触发器,因此您必须相应地实现您的逻辑。
如果您希望收到大量消息,那么选项 3 更适合。
您可能应该 post 到一个 SNS 主题,并让多个 lambda 订阅该主题并根据需要处理事件。
这里最好的选择是根本不将消息直接发送到队列。您可以使用 SNS 或 EventBridge 作为消息的目的地。然后你应该为每种类型的消息有一个队列。然后,您可以将每个队列订阅到源(SNS 或 EventBridge),并且只接收对该队列有意义的消息。使用 EventBridge,您可以对整个负载进行大量过滤。对于 SNS,您需要将类型添加到属性中,以便它可以用于过滤。
使用不同的订阅过滤器订阅 SNS 的多个 lambda 在这里看起来是最好的选择。 好处。
- 需要管理的最低基础设施。
- 订阅者(Lambdas)在收到消息后不用担心过滤问题,每个lambda会根据订阅过滤器中给定的条件得到特定的消息进行处理。
- SNS 将根据订阅过滤器处理路由部分。
您需要注意的唯一一点是使消息中的类型字段可用 Headers 以应用于订阅过滤器。