亚马逊 SQS 或任何队列服务的可能用例是什么?

30

因为我们公司的整个基础架构都是基于亚马逊的AWS,所以我一直在努力获取AWS。一个组件我从来没有能够正确理解的是队列服务,我已经在谷歌上搜寻了很多,但我还没有得到令人满意的答案。我觉得Cron job队列服务在某种程度上很相似,如果我错了请纠正我。

那么SQS到底是做什么的呢?据我所知,它存储简单的消息以供AWS中的其他组件执行任务,并且您可以发送消息来完成这些任务。

在这个问题中Can someone explain to me what Amazon Web Services components are used in a normal web service?;回答提到他们使用了SQS来排队异步执行的任务。为什么不直接向用户返回一条消息,稍后再进行处理呢?为什么要等待SQS处理完毕呢?

另外,假设我有一个Web应用程序,允许用户安排一些每日任务,那么SQS如何适用于此呢?

3个回答

95
不,cron和SQS不相似。其中一个(cron)安排作业,而另一个(SQS)存储消息。队列用于将消息生产者与消息消费者分离。这是一种实现规模和可靠性的架构方式。
假设您为一款热门电视节目构建了一款移动投票应用程序,500万到2500万观众同时投票(在每个演出结束时)。您如何在如此短的时间内(比如15秒)处理这么多的投票呢?您可以构建一个显著的Web服务器层和数据库后端,可以处理数百万条消息/秒,但这将是昂贵的,您必须为最大预期工作量进行预先配置,并且它不会是弹性的(例如对于数据库故障或限流)。如果很少有人投票,那么您为基础设施支付过多;如果投票变得疯狂,投票可能会丢失。
更好的解决方案是使用某些队列机制,将投票应用程序与您的服务分离开来,其中投票队列高度可扩展,因此它可以轻松地吸收10条消息/秒或1000万条消息/秒。然后,您需要一个应用程序层尽可能快地从该队列中拉取消息以计算投票结果。

5
使用案例有点像负载/峰值分布。但如果你拥有一个无服务器事件驱动的设置,这是否真的很重要呢?假设处理投票的代码是事件驱动的 Lambda,那么在这种情况下,预留和峰值并不太重要,最好的 SQS 能做的就是批处理,对吗? - Mojimi
这样,每次投票时只会触发一个 Lambda,并且如果明天有按客户计算投票的要求,您可以使用 SQS 队列或 FIFO SQS 队列来满足其他要求。那么,如何触发您的 Lambda?是通过 API 网关吗?您可以在 API 网关前面放置 SQS 队列,反之亦然。 - Ankur Kothari
@AnkurKothari 注意,当这个问题和答案被写下来时,Lambda还不到一岁。无论如何,通常情况下,Lambda函数会被调用一批消息,例如每次调用100条或更多。在这种情况下没有API网关。AWS Lambda服务轮询SQS队列并根据需要调用Lambda函数,并且可能调用许多Lambda函数实例,每个实例处理一个批次。如果需要,可以使用DynamoDB按某些分组进行计数。 - jarmod
在我的场景中,我的 Lambda 从 SQS 中读取,读取整个消息批次并创建一个新的 AWS 批处理,因为 Lambda 函数有时间限制。 - Ankur Kothari

11

我想在@jarmod的优秀而简洁的答案中补充一点,那就是消息的大小确实很重要。例如,在AWS中,最大大小仅为256 KB,除非您使用扩展客户端库,否则将最大值增加到2 GB。但请注意,它将S3用作临时存储。

在RabbitMQ中,实际限制约为100 KB。RabbitMQ没有硬编码的限制,但系统更多或更少地停滞不前。根据个人经验,RabbitMQ可以连续处理约1 MB大小的流式消息,持续时间约为1-2小时,但然后它将开始表现不稳定,常常变成僵尸进程,您需要重新启动该进程。


7

SQS是一种很好的解耦服务的方式,特别是需要大量处理批量任务的时候。

例如,假设您有一个服务,用户可以从他们的移动设备上传照片。一旦照片被上传,您的服务需要对照片进行大量处理,例如将它们缩放到不同的大小,应用不同的过滤器,提取元数据等。

实现这个的一种方法是向SQS队列发布一条消息(或根据架构原理发布多条消息到多个队列)。这些消息描述了需要在新上传的图像文件上执行的工作。一旦将消息写入SQS,您的应用程序就可以向用户返回成功,因为您知道您已经有了图像文件并且已经安排了处理。

在后台,您可以有服务器从SQS中读取消息,并执行消息中指定的工作。如果其中一个服务器出现故障,另一个服务器将拾取消息并执行工作。SQS保证消息最终会被传递,因此您可以确信工作最终会完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接