Zah*_*lly 9 amazon-sqs amazon-web-services aws-lambda
我正在寻求有关我正在使用产品做出的架构设计决策的帮助。
我们有多个生产者(由 API 网关调用 Lambda 启动)将消息放在 SQS 队列(请求队列)上。可以有多个同时调用,因此会有多个并行运行的 Lambda 实例。
然后我们有消费者(假设有 20 个 EC2 实例)在 SQS 上进行长轮询以获取消息以处理它们。它们每个需要大约 30-45 秒来处理一条消息。
理想情况下,我希望将响应发送回发出请求的生产者 - 这是我在 SQS 方面遇到的问题。理论上,我会有一个单独的响应队列,最初的 Lambda 生产者将使用它,但似乎没有办法挑选特定的相关响应。也就是说,每个 Lambda 函数可能会获取另一个函数的响应。我正在寻找类似于这种设计模式的东西:http : //soapatterns.org/design_patterns/asynchronous_queuing
我能看到的唯一选择是为每个 Lambda API 调用创建一个新的 SQS 响应队列,在消息中传递其 ARN 供消费者放置响应,但我无法想象这是非常有效的 - 特别是当有一分钟可能有数百条消息?我错过了一些明显的东西吗?
我想唯一的其他选择是设置更大的消息代理(例如 RabbitMQ/ApacheMQ)环境,但如果可能的话,我想避免这种情况。
谢谢!
为每个请求创建一个(临时)响应队列
聚会迟到了,但我想我可能会在我想要实现的目标上找到一些帮助,@MattHouser @Zaheer Ally,或者向从事相关问题的人提供一个想法。
我正面临着类似的挑战。我有一个 API,根据客户端的请求,它需要与多个外部 API 通信并收集(延迟)结果。
由于我的 PHP API 是同步的,它只能按顺序执行这些请求。所以,我想使用一个请求队列,生产者(API)将在其中发送消息。然后,多个工作人员将使用这些消息,每个工作人员执行这些外部 API 调用之一。
为了返回结果,生产者会创建一个临时响应队列,其名称标识符将嵌入发送给工作人员的消息中。因此,每个工人都会在这个临时队列上“发布”他的结果。
同时,生产者将继续轮询临时队列,直到他收到预期数量的消息。最后,他会删除队列并将收集到的结果发送回客户端。
是的,您可以使用 RabbitMQ 来实现更“rpc”的队列模式。
但如果您想留在 AWS 中,请尝试使用 SQS 以外的其他方式进行响应。
相反,您可以使用 S3 进行响应。当您的生产者将项目放入 SQS 时,请在消息中包含响应的 S3 目标。当您的使用者完成任务后,将响应放入所需的 S3 位置。
然后您可以检查 S3 的响应。
更新
您也许能够使用 Redis 来完成类似 RPC 的消息队列。
https://github.com/ServiceStack/ServiceStack/wiki/Messaging-and-redis
然后,您可以将 AWS ElastiCache 用于您的 Redis 集群。这将完全取代 SQS 的使用。
| 归档时间: |
|
| 查看次数: |
5605 次 |
| 最近记录: |