使用AWS SQS作为Aurora数据库的写入队列来提高系统性能是否有效

2024-03-24

我正在 AWS 上开发一个 Web 应用程序服务器,需要支持高吞吐量的读写。我的老板给了我这样的高级设计。

我被困在“写入队列”上。团队告诉我,我们需要它来提高写入性能,因为我们只能有 1 个可以写入的主副本。我对 SQS 和 RabbitMQ 等消息队列有一些基本知识,但对将其用作数据库写入队列一无所知。

现阶段我有3个问题:

  1. 使用这种架构,是不是真的能够提高写入数据库的性能(相对于直接写入主副本)。

  2. 当写入过程中出现错误时,如何处理事务,特别是如何回滚。通常,我们会在应用程序代码中控制事务,以便当发生错误时,整个事务回滚,并且应用程序服务器向客户端响应一些错误代码。

  3. 我提到我已经研究过使用消息队列作为写入队列,但我不确定我是否在寻找正确的方向。也许,已经有一些其他技术适合作为数据库的写入队列?

除了问题之外,我认为这应该是一个大主题,并且想知道我可以详细研究该主题的资源。


在类似的情况下,队列被用作解耦两个系统的手段。实现此类架构模式有几个优点和缺点。我将尝试列出我认为主要的内容。

优点

  1. 改进的响应时间

    由于队列不需要复杂的事务,因此它们通常是一种快速且安全的存储(如果配置正确)。这意味着来自客户端的感知响应延迟将会减少,给人一种服务“更快”的感觉。

  2. 关注点分离

    正确地解耦服务可以提高其对错误的恢复能力。例如,如果数据库无法接受更多写入请求,客户端将不会受到影响,并且它们的请求仍然不会丢失,因为它们将在队列中。这使得运营商有更多的时间来应对问题,而服务价值仅受到部分影响。

  3. 提高可扩展性

    当操作变得复杂时,将它们分成微组件通常是个好主意。扩展微型组件比单体服务更容易。作业队列支持这种设计模式。

缺点

  1. 从错误中恢复变得更加复杂

    如上所述,如果数据库停止接受请求,作业将堆积在队列中。现在您有两个问题需要处理:完整的数据库和完整的作业队列。系统问题开始像涟漪一样在您的架构中传播,导致一些副作用,并且很难理解根本原因是什么。

  2. 识别瓶颈需要更多时间

    如果数据库写入速度很慢,那么在它前面放置一个队列并不会让事情变得更快。作业仍然会堆积在队列中,您的下一个任务将是找出发生这种情况的原因。在处理复杂的 ETL 管道时,提高性能变成了一项相当乏味的打地鼠操作,其中瓶颈只是从一个系统转移到另一个系统。

  3. 每次操作的成本增加

    一项工作需要经历的阶段越多,所需的时间和金钱就越多。

解耦组件通常被视为处理性能问题的灵丹妙药。正确分离关注点和责任是一种非常有益的做法,但需要大量的经验和细心。如今,单一服务被视为万恶之源。就我个人而言,我更喜欢处理一堆整体的意大利面条,而不是分布式的意大利面条。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用AWS SQS作为Aurora数据库的写入队列来提高系统性能是否有效 的相关文章

  • 为什么在尝试使用 Java 连接到 RDS PostgreSQL 数据库时会收到 SocketTimeoutException?

    我有一个 Spring 应用程序 我试图在 AWS 上托管 几天来我一直在努力配置 我有一个 EC2 实例 并且能够通过 SSH 连接到它 我还在 AWS 中设置了 Postgres RDS 数据库 但我无法使用 IDE 中的代码连接到它
  • 从 Flask 中的 S3 返回 PDF

    我正在尝试在 Flask 应用程序的浏览器中返回 PDF 我使用 AWS S3 来存储文件 并使用 boto3 作为与 S3 交互的 SDK 到目前为止我的代码是 s3 boto3 resource s3 aws access key id
  • 访问 AWS 上的 Tensorboard

    我正在尝试访问 AWS 上的 Tensorboard 这是我的设置 张量板 tensorboard host 0 0 0 0 logdir train 在端口 6006 上启动 TensorBoard b 39 您可以导航到http 172
  • 如何动态更新我的 AWS CloudWatch 控制面板?

    我在 CloudWatch 中有几个仪表板 它们代表我的基础设施的静态视图 例如 自动扩展工作组中当前正在运行的实例数量 或者各种关键 EC2 实例的 CPU 磁盘状态 但是 当我添加新实例时 我总是需要手动更新仪表板以将它们包含在显示中
  • 在 aws-cdk 上的 aws-rds 上,使数据库可公开访问的设置在哪里?

    使用 AWS RDS 控制台和 CLI API 都有一个开关可以使数据库可公开访问 但我找不到使用提供的构造使用新的 aws cdk 来实现此目的的方法 Cloud Formation 类 例如 CfnDBInstance 中有一个布尔值
  • 在 Amazon EMR 上使用 java 中的 hbase 时遇到问题

    因此 我尝试使用作为 MapReduce 步骤启动的自定义 jar 来查询 Amazon ec2 上的 hbase 集群 我的 jar 在地图函数内 我这样调用 Hbase public void map Text key BytesWri
  • 如何将 kubernetes LoadBalancer Ingress URL 发布到 aws Route53

    今天 当我通过 aws 使用 kubernetes 启动一个应用程序时 它公开了一个公开可见的 LoadBalancer Ingress URL 但是要将其链接到我的域以使公众可以访问该应用程序 我需要在每个设备上的浏览器中手动进入 aws
  • 使用 AWS API Gateway 和 Lambda 从 multipart/form-data 获取非文件正文

    我正在尝试从multipart form data POST通过 API 网关连接到我的 AWS Lambda Web 服务 超文本传输 协议POST具有内容类型 multipart form data 和 URL 编码的正文 文件数据也在
  • RabbitMQ:如何创建和恢复备份

    我是 RabbitMQ 的新手 我需要一些帮助 如何备份和恢复到RabbitMQ 以及我需要保存哪些重要数据 谢谢 如果您安装了管理插件 您可以在Overview页 在底部你会看到导入 导出定义您可以使用它来下载代理的 JSON 表示形式
  • DynamoDB 中的时间戳应使用什么数据类型?

    我是 DynamoDB 新手 我希望创建一个使用 DeviceID 作为哈希键 时间戳作为范围键和一些数据的表 DeviceID 123 Timestamp 2016 11 11T17 21 07 5272333Z X 12 Y 35 在
  • Beanstalk 部署忽略 .ebextensions 中的 nginx 配置文件

    我在单实例 Elastic Beanstalk 环境中托管 Java Web 应用程序 并添加了几个 ebextension 文件 这些文件在每次部署时成功为我创建配置文件 然而 我无法找到一种方法让 Beanstalk 在 etc ngi
  • 在 RedShift 中声明变量

    SQL Server能够声明一个变量 然后在查询中调用该变量 如下所示 DECLARE StartDate date SET StartDate 2015 01 01 SELECT FROM Orders WHERE OrderDate g
  • 如何使用对象标记上传到 AWS S3

    有没有办法使用标签将文件上传到AWS S3 不将标签添加到S3中的现有文件 对象 我需要让该文件与我的 Tags 一起出现在 S3 中 即在单个 API 调用中 我需要这个 因为我使用 Lambda 函数 使用这些 S3 对象标签 由 S3
  • 从本地计算机连接到 AWS 上的 Neptune

    我正在尝试从办公室的本地计算机连接到 AWS 实例中的 Neptune DB 就像从办公室连接到 RDS 一样 是否可以从本地计算机连接 Neptune 数据库 Neptune 数据库是否公开可用 开发人员有什么方法可以从办公室连接 Nep
  • 将 Django 部署到 AWS;傻瓜静态文件

    我对这个项目的最后一步完全迷失了 到目前为止 我已经能够开发一个 Django 应用程序 它可以在本地主机上按照我想要的方式工作 我已经能够将网站部署到 AWS EC2 但我一定错过了有关提供静态文件的一些基本知识 我什至还没有尝试过媒体文
  • AWS EC2 应用程序负载均衡器 + 双向 SSL?

    是否可以使用 AWS Application Load Balancer 并使用双向 ssl 客户端证书 我当前的设置使用经典的 ELB 通过 tcp 转发到 Web 服务器端点来支持此操作 我现在需要使用 URL 路由流量 并希望在可能的
  • 使用 mosca MQTT 的请求响应模式

    有没有办法使用 mosca MQTT 实现请求响应模式 以 检查客户端的回复 如果在预期时间内未收到预期回复 则重新发布 我相信这在 Mqtt 5 中是可能的 但截至目前 我必须使用 QoS 1 的 Mosca 代理 支持直到 Mqtt 3
  • 使用 Elastic Beanstalk 进行 Logback

    我在使用 Elastic Beanstalk 记录应用程序日志时遇到问题 我正在 AWS Elastic Beanstalk 上的 Tomcat 8 5 with Corretto 11 running on 64bit Amazon Li
  • 将 sensu-client 连接到服务器时 AMQP 连接的 bad_header

    我已经安装了 sensu 和厨师社区食谱 但是 sensu客户端无法连接到服务器 导致rabbitmq连接错误 尝试连接时消息超时 这是详细的客户端日志 来自 sensu client log 的日志 timestamp 2014 07 0
  • AWS cognito 用户迁移池触发器不适用于登录流程

    我正在使用带有认知执行角色的 Lambda 函数进行 AWS 认知池迁移 以下是我的新池应用程序客户端设置 or AWS doc says 用户迁移身份验证流程 用户迁移 Lambda 触发器 允许从旧用户管理系统轻松迁移用户 进入您的用户

随机推荐

  • ActivityThread:找不到源

    我正在开发一个 Android 应用程序来比较两个静态图像 但是当我尝试调试该项目时 我在 ActivityThread 中找不到源代码 这是我的代码 查找器类 package com example testmatching import
  • Laravel 中的 Associate()

    我有 2 个模型 一个用户和一个地址 自从我读到它以来 我仍在尝试 Associate https laravel com docs 5 6 eloquent relationships updating belongs to relati
  • 为Windows应用程序实现webrtc数据通道[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有谁知道如何向用 C 构建的 Windows 应用程序实现 WebRTC DataChannel API 以便在 NAT 后面的客户端
  • Logstash 配置:检查布尔字段是否存在

    使用Logstash 1 4 2 我有一个字段myfield这是我的 JSON 文档中的布尔值 为了检查它是否存在 不关心布尔值 我使用了 if myfield exists else doesn t exist 测试该条件语句的结果是 m
  • 如何将换行符放入 R 中 xtable 的列标题中

    我有一个数据框 我正在将其放入sweave http www stat uni muenchen de leisch Sweave 使用 xtable 的文档 但是我的列名之一很长 我想将其分成两行以节省空间 calqc table lt
  • Weblogic:调用不带架构名称的 DB2 存储过程(属性 currentSchema)

    我有一个在 Weblogic 上运行的 Java 应用程序 应用程序需要访问 DB2 数据库中的存储过程 因此 JDBC 数据源是通过其 JNDI 名称来配置和访问的 数据源 ClassDriver com ibm db2 jcc DB2D
  • XSLT 生成 UUID

    如何使用纯 XSLT 生成 UUID 基本上是寻找一种使用 XSLT 创建独特序列的方法 该序列可以是任意长度 我正在使用 XSLT 2 0 这是一个好例子 http www pure xml com cblog index php arc
  • 如何使用 EPPlus 在 C# 中逐行读取 Excel 文件

    在我的 MVC 控制器中 我试图逐行读取 Excel 但是有一个问题 我希望能够将其映射到列表 模型类包含29个字段 public class GroupMembershipUploadInput public string chpt cd
  • 在 Visual Studio 中发布程序

    我是 Visual Studio 的新手 我正在尝试弄清楚如何 发布 我的程序 以便我可以将其移动到其他计算机并从那里运行它 我不确定这是否有什么不同 但我的解决方案中有三个项目 如果我发布它 我是否仍然能够继续开发原始文件等 多谢 好的
  • 画一条平滑的线

    我正在使用 libgdx 开发游戏 我想使用形状渲染器绘制一条平滑的线条 shaperenderer begin ShapeType Line shaperenderer line fisrstVec2 secondVec2 shapere
  • 如何通过Selenium和WebDriverWait等待元素包含特定属性?

    我有一个关于硒的问题是否有人可以帮忙 我需要进入一个 URL 页面 该页面上的节点最初处于 已注册 状态 X 秒后 其状态将动态更改为 就绪 状态 在其状态转变为 就绪 状态之前 我可能会在 selenium 执行期间继续执行后续步骤 这是
  • 使用 picasso 从 api 加载 recyclerview 中的图像

    使用 picasso 从 api 在 RecyclerView 中添加图像 使用Picasso加载图像非常简单 你可以这样做Picasso get load http i imgur com DvpvklR png into imageVi
  • 根据标签绘制分配颜色

    我确信有一个非常简单的方法可以做到这一点 但我一生都无法弄清楚 我正在 Plot ly 中绘制散点图 我绘制的每个点都被分配了一个标签 例如通过 高 低 西格玛高等 我的问题是我似乎无法修复plot ly 分配给每个标签的颜色 我希望 Pa
  • 将 Mechanize 设置为接受 cookie

    我正在尝试使用 mechanize 从网站检索一些数据以自动搜索公寓 无垃圾邮件 但是 当我向该站点发送请求时 响应具有以下标头 header Cache Control no store no cache max age 0 must r
  • IIS 7.5/Windows Server 2008 上的 PHP 错误日志

    我很困惑应该在运行 IIS 7 5 的 Windows 2008 Server 上寻找包含 php 错误的日志文件 我更熟悉 Mac OS X 的设置 在我的 php ini 文件中 我将 log errors 设置为 On 但我没有在该文
  • 在 CLion 中使用 WSL 工具链时如何启用 Rust 调试?

    我是 Rust 新手 现在在 Windows 上使用 CLion 和 JetBrains 的 Rust 插件 当我刚刚编译并运行时它运行良好 但是当我开始调试时 即使我将工具链切换到 WSL 它也会显示这样的对话框 我想知道 WSL 是否是
  • 在 React 中创建的选择控件不会在浏览器刷新时重置(IE11 和 Edge)

    我有一个非常简单的 React 应用程序 只有一个选择控件 查看工作应用程序here http www webpackbin com 4JyNOWVpW 选择控件有 3 个值 星期日 星期一和星期二 星期日是默认值 不幸的是 在 IE11
  • Java - ImageIO.write 的加载文件在 .jar 中不起作用

    我正在用 Java 制作一个游戏 我想将随机生成的地图保存在图像上 然后加载它 我的代码在 Eclipse 中工作没有问题 但是当我将其导出到 jar exe 文件时 创建文件 mapf 时出现问题 谢谢您的回答 private void
  • 我可以将动画应用到边距吗?

    我正在尝试在 CSS3 边距中制作动画 这这个网站 http css3 bradshawenterprises com transitions 似乎说你可以 但我无法工作 我实际上有3个动画 1 为简单的首字母fadeIn在初始负载上 然后
  • 使用AWS SQS作为Aurora数据库的写入队列来提高系统性能是否有效

    我正在 AWS 上开发一个 Web 应用程序服务器 需要支持高吞吐量的读写 我的老板给了我这样的高级设计 我被困在 写入队列 上 团队告诉我 我们需要它来提高写入性能 因为我们只能有 1 个可以写入的主副本 我对 SQS 和 RabbitM