如何使用 lambda 和 SQS 实现优先级队列架构?
How to implement a priority queue architucture using lambda and SQS?
我正在使用 SQS 和 lambda 来处理一些特定的请求。每个请求可以包含从 1 条消息到数十万条消息的消息。它工作正常,唯一的问题是小请求有时必须等待那些已经在队列中的大请求(因为所有并发的 lambda 都被占用,我不想增加我的 lambda 并发)。所以我想有两个队列,一个用于小请求,一个用于大请求,这样可以更快地处理小请求。但挑战在于如何为每个队列分配 lambda 并发数。现在我将 lambda 并发设置为 30,但是如果有一个大请求进来,所有 30 个 lambda 都会很忙。有什么方法可以根据触发它的 SQS 队列告诉 lambda 部分使用并发 lambda(假设大请求为 20,小请求为 10)?还是有任何其他最佳实践来实现这种要求?
您可以拥有函数的两个副本:一个用于具有 20 个预留并发的大型请求,另一个用于具有 10 个预留并发的小型请求。
每个函数都由相应的队列触发 - 这是处理优先级消息的最常见方法。
然而,缺点是即使优先级消息队列为空,您也总是保留 10 个并发。
Is there any way to tell lambda to use concurrent lambda partially
不,一旦部署,它们将 运行 按照配置。
此外,我认为这不应该是 Lambda
使用问题。您可以通过多层队列来控制 active 队列长度。一个过于简化的解决方案是
- 创建 2 个 wait 队列,大消息和短消息各一个。
- 创建一个 active 队列,将消息馈送到您的
Lambda
消费者。
- 生产者将请求发送到等待个队列。
- 编写逻辑以将消息从 wait 队列移动到 active 队列。这段代码应该具有根据您的业务需求分发消息的逻辑。
我正在使用 SQS 和 lambda 来处理一些特定的请求。每个请求可以包含从 1 条消息到数十万条消息的消息。它工作正常,唯一的问题是小请求有时必须等待那些已经在队列中的大请求(因为所有并发的 lambda 都被占用,我不想增加我的 lambda 并发)。所以我想有两个队列,一个用于小请求,一个用于大请求,这样可以更快地处理小请求。但挑战在于如何为每个队列分配 lambda 并发数。现在我将 lambda 并发设置为 30,但是如果有一个大请求进来,所有 30 个 lambda 都会很忙。有什么方法可以根据触发它的 SQS 队列告诉 lambda 部分使用并发 lambda(假设大请求为 20,小请求为 10)?还是有任何其他最佳实践来实现这种要求?
您可以拥有函数的两个副本:一个用于具有 20 个预留并发的大型请求,另一个用于具有 10 个预留并发的小型请求。
每个函数都由相应的队列触发 - 这是处理优先级消息的最常见方法。
然而,缺点是即使优先级消息队列为空,您也总是保留 10 个并发。
Is there any way to tell lambda to use concurrent lambda partially
不,一旦部署,它们将 运行 按照配置。
此外,我认为这不应该是 Lambda
使用问题。您可以通过多层队列来控制 active 队列长度。一个过于简化的解决方案是
- 创建 2 个 wait 队列,大消息和短消息各一个。
- 创建一个 active 队列,将消息馈送到您的
Lambda
消费者。 - 生产者将请求发送到等待个队列。
- 编写逻辑以将消息从 wait 队列移动到 active 队列。这段代码应该具有根据您的业务需求分发消息的逻辑。