队列-它是什么,为什么以及如何使用它? 看看AWS SQS功能


首先,让我们定义“队列”的概念。


考虑队列类型“ FIFO”先进先出 )。 如果您从Wikipedia中获取值-“这是一种抽象数据类型,具有访问元素的原则。” 简而言之,这意味着我们不能以随机的顺序从中获取数据,而只能获取最先出现的内容。

接下来,您需要决定为什么完全需要它们?


1.用于延迟操作。 一个典型的例子是图像处理。 例如,一个用户将图片上传到我们需要处理的站点,此操作需要很多时间,该用户不想等待那么多。 因此,我们加载图片,然后将其传输到队列中。 当任何“工人”得到它时,它将被处理。

2.用于处理峰值负载。 例如,系统的某些部分有时会导致大量流量,并且不需要即时响应。 作为一种选择,生成任何报告。 将此任务扔到队列中-我们有机会以均匀的系统负载来处理它。

3.可扩展性。 也许最重要的原因是,队列使之成为可能
扩大规模。 这意味着您可以调出多个服务进行并行处理,这将大大提高生产率。

现在让我们看一下如果我们自己创建队列将面临的问题:


1.并行访问。 只有一个处理程序可以从队列中获取消息。 也就是说,如果同时有两个服务请求消息,则每个服务必须返回唯一的消息集。 否则,一个消息将被处理两次。 可能会充满烦恼。

2.重复数据删除机制。 该服务应具有防止队列重复的系统。 可能存在一个情况,即同一数据集两次被偶然发送到队列。 结果,我们将处理同一件事两次。 这又是困扰。

3.错误处理机制。 假设我们的服务从队列中接收了三则消息。 他通过从队列发送删除请求成功处理了其中的两个。 第三,他无法处理而死。 处于处理状态的消息不可用于其他服务。 并且它不应该永远保持处理状态。 此类消息应通过某种逻辑传递给另一个处理程序。 稍后将以AWS SQS(简单队列服务)为例考虑该逻辑的实现示例。

Amazon Web Services-简单队列服务


现在让我们看一下SQS如何解决这些问题以及它可以做什么。


1.并行访问。 在队列中,可以设置“ 可见性超时”参数。 它确定消息处理可能要花多长时间。 默认情况下为30秒。 当服务接收到一条消息时,它将转移到“正在运行”状态30秒钟。 如果在这段时间内没有命令从队列中删除此消息,则它将返回到开头,并且下一个服务可以再次接收该消息以进行处理。

小shemka工作。


注意:注意。 在某些情况下,SQS可能会发送重复消息(项目“至少一次发送”)。 因此,您的服务应该是幂等的。

2.错误处理机制。 在SQS中,您可以为“死”消息(死信队列)配置第二个回合。 也就是说,那些无法处理我们服务的邮件将被发送到一个单独的队列,您可以自行决定处置该队列。 您还可以设置尝试将失败消息发送到“死”队列的次数。 尝试失败是“可见性超时”到期。 也就是说,如果在此期间未发送删除请求,则该消息将被视为未处理,并将返回到主队列或进入“死区”。

3.重复数据删除。 SQS还具有重复保护系统。 每个消息都有一个“重复数据删除ID” ,SQS不会将消息与
重复“重复数据删除ID” 5分钟。 您必须在每封邮件中指定一个“重复数据删除ID”,或启用基于内容的ID生成。 这意味着根据您的内容生成的哈希将进入“重复数据删除ID”。 参数“基于内容的重复数据删除”。 有关重复数据删除的更多信息
注意:如果您在5分钟内发送了两条相同的消息,并且已启用“基于内容的重复数据删除”,请务必注意 SQS不会在队列中添加第二条消息。
注意:例如,请注意,如果设备上的连接断开并且没有收到响应,然后在5分钟后发送第二个请求,则会创建一个重复。
4.长投票。 长期调查 。 SQS支持此类连接,最大超时时间为20秒。 是什么使我们可以节省流量和服务的“催人泪下”。

5.指标。 Amazon还提供了详细的队列指标。 例如已接收/已发送/已删除消息的数量,这些消息的大小(以KB为单位)等等。 您还可以将SQS连接到CloudWatch日志服务。 在那里您可以看到更多。 您还可以在此处配置所谓的“警报”,并且可以为任何事件配置操作。 了解有关连接到SQS的更多信息。CloudWatch文档

现在让我们看一下队列设置:


主要的:


默认可见性超时-接收后不可见的秒数/分钟/小时数。 最长处理时间为12小时。

邮件保留期限-秒/分钟/小时/天的数量,这表示未处理的邮件将在队列中存储多长时间。 最多-14天。

最大邮件大小-最大邮件大小,以KB为单位。 取值范围是1KB〜256KB。

传递延迟-您可以设置将消息传递到队列的延迟时间。 从0秒到15分钟(实际上,消息将在队列中,但看不到接收消息)。

接收消息等待时间-时间,如果我们使用“长轮询”接收新消息,连接将保持多长时间。

基于内容的重复数据删除-如果将其设置为true,则将标记“重复数据删除ID”作为从内容生成的SHA-256哈希值添加到每条消息中。

死队列设置


使用重新驱动策略-如果设置了一个标志,则几次尝试后邮件将被重定向。

死信队列-原始消息将发送到的“死”队列名称。

最大接收-处理尝试失败的次数,之后该消息将被发送到“无效”队列
注意:另外请注意,我们可以将所有主要参数与每条消息一起发送。 例如,每个单独的消息可能具有其自己的可见性超时传递延迟。

现在介绍一下消息本身及其属性:


一条消息有几个参数:

1.邮件正文-任何文本
2.消息组ID类似于标签,通道,是所有消息所必需的。 保证每个此类组均以FIFO模式处理。
3.邮件重复数据删除ID-标识重复的字符串。 如果设置了“基于内容的重复数据删除”模式,则该参数是可选的。

还有消息属性


属性由名称,类型和值组成。

1.名称-字符串
2.类型-有几种类型:字符串,数字,二进制。 该类型只是以字符串形式出现,并且可以为该类型添加后缀。 在这种情况下,类型将通过点后缀与该后缀一起出现,例如string.example_postfix。
3.值-字符串
注意:请注意,属性的最大数量为10
PS:本文提供了队列的简要说明,以及有关SQS的功能和机制的一些信息。 以下文章将专门介绍AWS Lambda ,然后进行实际共享。

Source: https://habr.com/ru/post/zh-CN457068/


All Articles