📅  最后修改于: 2020-11-07 03:23:00             🧑  作者: Mango
什么是SQS?
- SQS代表简单队列服务。
- SQS是AWS中的第一个可用服务。
- Amazon SQS是一项Web服务,使您可以访问消息队列,该消息队列可用于存储消息,同时等待计算机对其进行处理。
- Amazon SQS是一个分布式队列系统,使Web服务应用程序能够快速可靠地将应用程序中一个组件生成的消息排队,以供另一组件使用,其中队列是等待处理的消息的临时存储库。
- 借助SQS,您可以在任何数量的软件组件之间发送,存储和接收消息,而不会丢失消息。
- 使用Amazon sqs,您可以分离应用程序的组件,以便它们可以独立运行,从而简化了组件之间的消息管理。
- 分布式应用程序的任何组件都可以将消息存储在队列中。
- 消息最多可以包含256 KB的任何格式的文本,例如json,xml等。
- 应用程序的任何组件以后都可以使用Amazon SQS API以编程方式检索消息。
- 队列充当组件生成和保存数据之间的缓冲区,并且组件接收数据进行处理。这意味着,队列可以解决以下问题:如果生产者生产工作的速度超过了消费者可以处理的速度,或者生产者或消费者仅间歇性地连接到网络,则该队列得以解决。
- 如果您有两个正在拉SQS队列的EC2实例。如果消息数量超过一定限制,则可以配置自动伸缩组。假设消息数量超过10,则可以添加其他EC2实例以更快地处理作业。这样,SQS提供了弹性。
让我们通过一个例子来理解。
让我们看一个生成Meme的网站。假设用户想要上传照片并想要转换为Meme。用户在网站上上传照片,网站可能会将照片存储在s3中。上传完成后,就会触发Lambda函数。 Lambda将有关此特定图像的数据分析到SQS,并且该数据可以是“模因的顶部应该说什么”,“模因的底部应该说什么”,S3存储桶的位置等。数据位于在SQS中作为消息。 EC2实例查看该消息并执行其工作。 EC2实例创建一个Meme并将其存储在S3存储桶中。 EC2实例完成其工作后,将移回SQS。最好的事情是,如果您丢失了EC2实例,那么您也不会丢失该作业,因为该作业位于S3存储桶中。
让我们看一下SQS的另一个示例,即旅行网站。
假设用户想要寻找一个包裹假期,并想要寻找可能的最佳航班。 AUser在浏览器中键入查询,然后命中EC2实例。 EC2实例看起来“用户正在寻找什么?”,然后将消息放入SQS的队列中。 EC2实例拉入队列。 EC2实例不断拉队列并寻找要执行的作业。一旦获得工作,便对其进行处理。它会查询航空公司的服务以获得所有最佳航班。它将结果发送到Web服务器,然后Web服务器将结果发送回用户。然后,用户根据他或她的预算选择最佳航班。
如果没有SQS,那会发生什么?
Web服务器将信息传递到应用程序服务器,然后应用程序服务器查询航空公司服务。如果应用服务器崩溃,则用户将丢失其查询。关于SQS的一大优点是,即使应用程序服务器崩溃,数据也会在SQS中排队,该队列中的消息在超时间隔窗口中被标记为不可见。超时用完后,消息将重新出现在队列中。那么新的EC2实例可以使用此消息执行其工作。因此,可以说SQS消除了应用程序服务器依赖性。
队列类型
队列有两种类型:
- SQS提供标准队列作为默认队列类型。
- 它允许您每秒进行无限数量的交易。
- 它保证消息至少传递一次。但是,有时,一个消息的多个副本可能无法按顺序传递。
- 它提供尽力而为的排序,以确保通常以与发送消息相同的顺序来传递消息,但它不提供保证。
- FIFO队列是标准队列的补充。
- 它保证排序,即,它们的发送顺序也以相同的顺序接收。
- 队列的最重要特征是FIFO队列和精确一次处理,即,一条消息仅传递一次并保持可用状态,直到使用者处理并删除它为止。
- FIFO队列不允许将重复项引入到队列中。
- 它还支持消息组,该消息组允许在单个队列中包含多个有序消息组。
- FIFO队列每秒被限制为300个事务,但是具有标准队列的所有功能。
SQS可见性超时
- 可见性超时是在阅读器接收到该消息后,该消息在SQS队列中不可见的时间。
- 如果在可见性超时到期之前处理了提供的作业,则该消息将从队列中删除。如果在这段时间内未处理该作业,则该消息将再次变为可见,并且另一位读者将对其进行处理。这可能导致同一封邮件被发送两次。
- 默认可见性超时为30秒。
- 如果您的任务耗时超过30秒,则可以增加可见性超时。
- 可见性超时最长为12小时。
要记住的要点:
- SQS是基于拉的,而不是基于推的。
- 邮件大小为256 KB。
- 邮件会在1分钟到14天之间保留在队列中。
- 默认保留期为4天。
- 它保证您的消息将至少被处理一次。