使用AWS SQS作为Aurora数据库的写入队列提高系统性能是否有效
Is it valid to use AWS SQS as a write queue to Aurora database to increase system performance
我正在 AWS 上开发需要支持高读写吞吐量的 Web 应用程序服务器。老大给了我这样的高级设计
我卡在 "Write Queue" 上了。团队告诉我,我们需要它来提高写入性能,因为我们只能写入 1 个主副本。我对SQS和RabbitMQ等消息队列有一些基础知识,但对将其用作数据库写入队列一无所知。
现阶段我有3个问题:
使用这种架构,是否真的能够提高写入数据库的性能(相对于直接写入主副本)。
如何处理事务,特别是在写入过程中出现错误时如何回滚。通常,我们会在应用程序代码中控制事务,当发生错误时,整个事务被回滚,App Server 响应给客户端一些错误代码。
我提到我已经研究过使用消息队列作为写队列,但我不确定我是否在寻找正确的方向。也许,已经有一些其他技术适合作为数据库的写入队列?
除了问题之外,我认为这应该是一个很大的话题,我想知道我可以详细研究这个话题的资源。
在类似的情况下,队列被用作解耦两个系统的手段。实施此类架构模式时有几个优点和缺点。我会尝试列出我认为是主要的。
优势
响应时间缩短
由于队列不需要复杂的事务,因此它们通常是一种快速且如果配置正确则安全的存储。这意味着来自客户端的感知响应延迟将减少,给人一种服务 "faster" 的感觉。
关注点分离
正确解耦服务可以提高它们对错误的恢复能力。例如,如果 DB 不能接受更多的写请求,客户端将不受影响,并且他们的请求仍然不会丢失,因为它们将在队列中。这使运营商有更多时间对问题做出反应,而服务价值仅受到部分影响。
改进的可扩展性
当操作变得复杂时,将它们分成微组件通常是个好主意。扩展微组件比单体服务更容易。作业队列启用了这样的设计模式。
缺点
从错误中恢复变得更加复杂
如上所述,如果数据库停止接受请求,作业将堆积在队列中。现在您有 2 个问题需要处理:完整的数据库和完整的作业队列。系统问题开始像涟漪一样在您的体系结构中传播,导致一些副作用,并且很难理解根本原因是什么。
识别瓶颈需要更多时间
如果数据库写入很慢,在它前面放一个队列不会让事情变得更快。作业仍会堆积在队列中,您的下一个任务将是找出发生这种情况的原因。在处理复杂的 ETL 管道时,提高性能成为一项相当乏味的打地鼠操作,您的瓶颈只是从一个系统转移到另一个系统。
每次操作的成本增加
一项工作完成所需的阶段越多,该工作所需的时间和金钱就越多。
解耦组件通常被视为处理性能问题的灵丹妙药。正确分离关注点和责任是一种非常有益的做法,但需要大量的经验和细心。如今,单一服务被视为万恶之源。就我个人而言,我更喜欢处理一大堆意大利面,而不是分布式的。
我正在 AWS 上开发需要支持高读写吞吐量的 Web 应用程序服务器。老大给了我这样的高级设计
我卡在 "Write Queue" 上了。团队告诉我,我们需要它来提高写入性能,因为我们只能写入 1 个主副本。我对SQS和RabbitMQ等消息队列有一些基础知识,但对将其用作数据库写入队列一无所知。
现阶段我有3个问题:
使用这种架构,是否真的能够提高写入数据库的性能(相对于直接写入主副本)。
如何处理事务,特别是在写入过程中出现错误时如何回滚。通常,我们会在应用程序代码中控制事务,当发生错误时,整个事务被回滚,App Server 响应给客户端一些错误代码。
我提到我已经研究过使用消息队列作为写队列,但我不确定我是否在寻找正确的方向。也许,已经有一些其他技术适合作为数据库的写入队列?
除了问题之外,我认为这应该是一个很大的话题,我想知道我可以详细研究这个话题的资源。
在类似的情况下,队列被用作解耦两个系统的手段。实施此类架构模式时有几个优点和缺点。我会尝试列出我认为是主要的。
优势
响应时间缩短
由于队列不需要复杂的事务,因此它们通常是一种快速且如果配置正确则安全的存储。这意味着来自客户端的感知响应延迟将减少,给人一种服务 "faster" 的感觉。
关注点分离
正确解耦服务可以提高它们对错误的恢复能力。例如,如果 DB 不能接受更多的写请求,客户端将不受影响,并且他们的请求仍然不会丢失,因为它们将在队列中。这使运营商有更多时间对问题做出反应,而服务价值仅受到部分影响。
改进的可扩展性
当操作变得复杂时,将它们分成微组件通常是个好主意。扩展微组件比单体服务更容易。作业队列启用了这样的设计模式。
缺点
从错误中恢复变得更加复杂
如上所述,如果数据库停止接受请求,作业将堆积在队列中。现在您有 2 个问题需要处理:完整的数据库和完整的作业队列。系统问题开始像涟漪一样在您的体系结构中传播,导致一些副作用,并且很难理解根本原因是什么。
识别瓶颈需要更多时间
如果数据库写入很慢,在它前面放一个队列不会让事情变得更快。作业仍会堆积在队列中,您的下一个任务将是找出发生这种情况的原因。在处理复杂的 ETL 管道时,提高性能成为一项相当乏味的打地鼠操作,您的瓶颈只是从一个系统转移到另一个系统。
每次操作的成本增加
一项工作完成所需的阶段越多,该工作所需的时间和金钱就越多。
解耦组件通常被视为处理性能问题的灵丹妙药。正确分离关注点和责任是一种非常有益的做法,但需要大量的经验和细心。如今,单一服务被视为万恶之源。就我个人而言,我更喜欢处理一大堆意大利面,而不是分布式的。