aws sqs基础概念和队列参数解析

2024-05-26 00:28

本文主要是介绍aws sqs基础概念和队列参数解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

分布式队列的组成部分

  • 生产者,向队列发送消息的组件
  • 消费者,接受队列消息
  • 队列,多个sqs服务器存储冗余存储消息

sqs自动删除超过最大留存时间的消息(默认4天),可以通过SetQueueAttributes调整为(60 s to 1,209,600 s (14 天) )

消息的生命周期

  • 生产者向sqs发送消息,在多个服务器上冗余存储

  • 消费者请求消费,可见性超时开始计时,消息并未删除但不接受后续消费请求

  • 消费者消费完毕删除消息,避免可见性超时后重复消费

队列类型

标准队列

由于分布式存储,sqs副本服务器可能故障导致消费和删除消息失败,导致重复消费。需要将application设置为幂等的

fifo队列

  • 发送消息时消息本身带有不重复id,sqs按照发送顺序处理
  • 如果多个生产者向同一个消息组id发送,则在消费组中按照先后顺序处理
  • 消息仅在同一个消息组中有序,不同消息组的消息无序
  • 队列中的消息组数量没有上限
  • 无法接收指定消费组的消息
  • 接受具有多个消息组id的队列时,sqs首先尝试返回尽可能多的具有相同消息组 ID 的消息
  • fifo队列允许重试逻辑
  • fifo在标准队列的基础上引入了exactonce,需要配置基于内容的重复数据删除(使用SHA-256 hash生成去重id)或者显示提供去重id
  • 不能将现有的标准队列转换为 FIFO 队列,必须为应用程序创建一个新的 FIFO 队列
  • fifo队列不支持每个消息延迟,只支持每个队列延迟
  • fifo的数据在分片中存储,请求接近或超过分片上限会自动添加新分片,分片的利用率较低可能会减少分片,此操作对用户透明
  • 消息所处的分片取决于消息组id的hash,建议大量使用消息组id区分分片
  • sqs异步缓冲客户端不支持fifo队列
  • 不兼容fifo队列的服务包括,s3事件通知,asg生命周期钩子,iot规则行动,lambda死信队列

队列比较

队列类型标准队列FIFO 队列
吞吐量无限吞吐量,支持每个 API 操作每秒几乎无限次的 API 调用高吞吐量 ,如果使用批处理,则每个 API 方法(发送,接受,删除),FIFO 队列每秒最多支持 3,000 条消息。每秒 3000 条消息指可能 300 个 API 调用,每个调用都包含10 条消息。可以提限
不使用批处理,FIFO 队列的每个 API 方法(发送,接受,删除)每秒最多支持 300 个 API 调用
数据重复at least onceexact once
数据有序尽力排序 ,可能乱序
img
先进先出传送 — 严格保留消息的发送和接收顺序。
img
使用场景当吞吐量很重要时当事件的顺序重要时

队列参数

可见超时

 	            Visibility Timeout

  • 可见性超时设置从队列接收的消息(由一个使用者接收)对其他消息使用者不可见的时间长度
  • 如果消息必须只接收一次,则使用者必须在可见性超时期间删除该消息
  • 默认的可见性超时设置为30秒
  • 为了获得最佳性能,将可见性超时设置为大于 AmazonWebServicesSDK 读超时

消息保留期

  • 保留不会被删除的消息的时间量

  • 默认4天,保留时间从60秒到1,209,600秒(14天)不等

  • 消息的过期时间总是基于其原始的队列时间戳。当消息移动到死信队列时,队列时间戳保持不变。例如,如果一条消息在被移动到死信队列之前在原始队列中停留1天,并且死信队列的保留期被设置为4天,那么该消息将在3天后从死信队列中删除

延迟时间

img

  • 适用于使用者需要额外的时间来处理消息。发送到队列的任何消息在延迟期间对使用者都是不可见的
  • 队列的默认(最小)延迟为0秒,最多15分钟
  • 对于标准队列该设置不可回溯的(不会影响队列中已有消息的延迟)。对于 FIFO 队列是可追溯的

最大消息大小

  • 支持的最小消息大小为1字节,最大大小为262,144字节(256 KB)
  • 要发送大于256kb 的消息,可以使用 sqs 扩展的 Java 客户端库。该消息包含对 AmazonS3中消息有效负载的引用。最大有效载荷大小为2G

接收消息等待时间

  • 接收消息等待时间是轮询等待消息可用以接收的最长时间
  • 最小值为0秒,最大值为20秒
  • 在服务端(设置上限),如果将接收消息等待时间设置为0,则接收请求使用短轮询
  • 在客户端(实际轮询时间),当 ReceiveMessage 请求的 WaitTimeSecond 参数设置为0时,将发生短轮询

Redrive allow

  • 定义哪些源队列可以使用此队列作为死信队列
  • 通过 ARN 指定最多10个源队列的列表
  • 源队列必须由相同的帐户拥有,并且必须与死信队列驻留在相同的区域中

死信队列

  • MaxReceiveCount 是使用者在移动到死信队列之前尝试从队列接收消息而不删除消息的次数

  • DLQ 队列类型(标准或 FIFO)必须与源队列匹配

  • 源队列和死信队列必须由相同的帐户拥有,并且必须与死信队列驻留在相同的区域中

队列权限

授权其他账户访问sqs权限的示例

{"Sid": "__sender_statement","Effect": "Allow","Principal": {"AWS": ["12323112441"]},"Action": ["SQS:SendMessage"],"Resource": "arn:aws-cn:sqs:cn-north-1:xxxxxxxxxxx:"
},
{"Sid": "__receiver_statement","Effect": "Allow","Principal": {"AWS": ["12323112441"]},"Action": ["SQS:ChangeMessageVisibility","SQS:DeleteMessage","SQS:ReceiveMessage"],"Resource": "arn:aws-cn:sqs:cn-north-1:xxxxxxxxxxx:"
}

这篇关于aws sqs基础概念和队列参数解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1003041

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工