Amazon web services 从一个SQS触发器触发多个lambda函数

Amazon web services 从一个SQS触发器触发多个lambda函数,amazon-web-services,aws-lambda,amazon-sqs,Amazon Web Services,Aws Lambda,Amazon Sqs,我不确定我是否正确理解AWS Lambda-SQS触发器。我是否可以将其配置为一个SQS队列可以根据消息体或消息属性触发不同的lambda函数 我的用例:我有三个不同的lambda函数(processCricket、processFootball、ProcessTenning),每个函数都执行一个独特的功能。我有一个接收消息的单队列(processGame)。队列中的每条消息都有一个属性“type”,即“Cricket”、“Football”或“network”。我可以根据消息上的“类型”调用不

我不确定我是否正确理解AWS Lambda-SQS触发器。我是否可以将其配置为一个SQS队列可以根据消息体或消息属性触发不同的lambda函数

我的用例:我有三个不同的lambda函数(processCricket、processFootball、ProcessTenning),每个函数都执行一个独特的功能。我有一个接收消息的单队列(processGame)。队列中的每条消息都有一个属性“type”,即“Cricket”、“Football”或“network”。我可以根据消息上的“类型”调用不同的lambda函数吗

选项1:配置SQS以根据类型触发不同的lambda函数(不确定是否可以这样做)

选项2:配置一个lambda函数,该函数可以检查类型,然后根据其类型调用其他lambda函数

选项3:为每个lambda创建单独的队列。通过将消息添加到适当的队列来控制哪个lambda处理该消息

选项1:配置SQS以根据类型触发不同的lambda函数

在lambda使用
类型之前,您无法了解它。所以这是不可能的

选项2:配置一个lambda函数,该函数可以检查类型,然后根据其类型调用其他lambda函数

是的,这是第一种选择的“可能”方式。但根据你的使用情况,它可能会“更贵”。在批处理模式下使用sqs时,必须通过进行多个检查来调用多个lambda

选项3:为每个lambda创建单独的队列。通过将消息添加到适当的队列来控制哪个lambda处理该消息

在我看来,这可能是最好的选择。您可以为每个队列配置不同的DLQ,根据您的业务规则设置不同的批处理大小,无需额外的lambda来增加“复杂性”。您应该而不是将多个lambda函数配置为单个SQS队列的触发器。这是因为SQS中的消息将传递给任何一个消费者,而该消费者正在处理该消息时,其他人将看不到该消息。因此,您将无法决定哪种“类型”的消息传递给哪种函数,因此选项1无效

选项2和3都可以正常工作。如果您不希望将许多消息传递到您的队列,因此不必担心,我会选择选项2。还要注意,多条消息可以在一个批中传递到Lambda触发器,因此您必须相应地实现您的逻辑


如果您希望收到大量消息,那么选项3更合适。

您可能应该发布到SNS主题,让多个lambda订阅该主题,并按照他们的意愿处理事件。

您最好的选择是根本不将消息直接发送到队列。您可以使用SNS或EventBridge作为消息的目的地。然后,每种类型的消息都应该有一个队列。然后,您可以将每个队列订阅到源(SNS或EventBridge),并且只接收对该队列有意义的消息。使用EventBridge,您可以对整个负载进行大量过滤。对于SNS,您需要将类型添加到属性中,以便用于过滤


谢谢你的帮助。我想选项2对我来说仍然是个坏主意,因为我最终会编写并维护一个额外的lambda函数。使用更多队列似乎没有额外的成本。因此,选项3似乎更合适。问题已经提出1年了,解决方案已经实施,并在生产中运行良好。你建议我不应该直接向队列发送消息,而是应该使用SNS或EventBridge,但你没有解释为什么这是个坏主意。我可以知道为什么吗?谢谢。因为SQS是为单个消费者设计的。根据消息,您有不同的消费者。这正是SNS或EventBridge的用途。您只发送一条消息,消费者就可以决定他们想要什么消息。通过让消息进入单个队列,然后让某个东西从那里路由消息,您就创建了额外的工作和明确的反模式。选项3正是这样做的。每个队列都有一个使用者。消费者不能决定他们想要什么。发布者决定哪个队列将处理消息并将其发送到适当的队列。这在生产者和消费者之间创建了紧密耦合。