我正在寻找与我正在使用产品进行的架构设计决策有关的帮助。AWS SQS异步排队模式(请求/响应)
我们已经有多个生产者(由API网关调用到Lambda中发起)将消息放入SQS队列(请求队列)中。可以有多个同时调用,所以会有多个并行运行的Lambda实例。
然后我们有消费者(让我们说20个EC2实例)对SQS进行长时间轮询以处理消息。他们需要大约30-45秒来处理每条消息。
然后,我会理想地将响应发回给发出请求的生产者 - 这是我与SQS一起努力的部分。理论上我会有一个单独的响应队列,最初的Lambda生产者将会消耗这些响应队列,但似乎没有办法选择具体的相关响应。也就是说,每个Lambda函数可能会选择另一个函数的响应。我正在寻找类似于此设计模式的东西:http://soapatterns.org/design_patterns/asynchronous_queuing
我可以看到的唯一选择是为每个Lambda API调用创建一个新的SQS Response队列,并在其消息中传递消息中的ARN对此的回应,但我无法想象这非常有效 - 尤其是当每分钟有数百条消息时?我错过了明显的东西吗?
我想唯一的另一种选择是设置一个更大的消息代理(例如RabbitMQ/ApacheMQ)环境,但是我希望尽可能避免这种情况。
谢谢!
嗨马特,谢谢你的回应。我不确定S3如何在这种情况下工作 - 生产者将不得不轮询以检查S3响应文件是否存在? S3上没有长时间轮询我可以找到,所以即使我每秒都检查一次,它看起来效率很低,特别是每分钟可能有数百个请求。 –
正确,你将不得不轮询S3。 AWS无法向您的Lambda函数反馈回应已准备就绪。所以你有4个选项:(a)使用SQS,每个请求一个队列,(b)使用SQS,共享结果队列(这两个选项都不是理想的),(c)轮询某个结果的东西(S3,数据库等) 。),或(d)使用非AWS服务。 –
再次感谢,我感谢您在此问题上的明确和专业知识。我之前没有使用过Redis,但是你的链接(特别是Request + Reply MQ Pattern)听起来像是一个很好的选择,所以我会调查一下,看看它是否适用于我们的环境。再次感谢。 –