Symfony和AWS RDS中的大量并发POST请求

问题描述

我是初级产品的后端开发人员,该产品平均每月有大约100.000用户。我们的高级后端开发人员突然辞职了,现在我自己一个人,还有很多东西要学习。因此,这是初学者的问题。

我们有一个Symfony 3应用程序使用Doctrine和Sonata Admin软件包连接到MysqL数据库(托管在AWS RDS上),并在大约2-4个AWS EC2实例上运行。我们需要处理的大多数请求都是GET请求,该请求为每个用户返回相同的数据,因此非常可缓存,这就是为什么我们仅使用2-4个EC2实例即可为大量用户提供服务的原因。

现在,我的任务是创建一个非常轻量级的“分析”系统,该系统为每个用户每次使用该应用程序时存储一些数据。意思是一个POST请求,每次用户使用该应用程序时,该请求都会写入数据库

我们有时在应用程序中有20.000个并发用户。如何在不使EC2自动扩展爆炸或阻塞数据库的情况下实现这一目标?该用户数据不是时间敏感的,因此不必立即将其写入数据库。最多可以延迟一个小时左右。

谢谢。

解决方法

我建议使用SNS + SQS + Lambda来实现这一目标。一种常见的设计模式称为“扇出”。在这种模式下,发布到SNS主题的消息将并行分发到多个SQS队列。通过使用此模式,您可以构建利用并行异步处理优势的应用程序。例如,您可以在用户每次使用该应用程序时将消息发布到主题。独立流程(使用AWS Lambda),每个流程均从单独的SQS队列中读取数据并将其推送到数据库中。 enter image description here 图片来自:https://www.jeremydaly.com/how-to-use-sns-and-sqs-to-distribute-and-throttle-events/

该设计模式的优点:

  1. 这种设计模式具有很高的可扩展性,甚至可以处理上百万个并发请求。
  2. 实施非常容易,因为组件已经可以集成
  3. 这种模式是可重用的,可以扩展到将来的任何新要求。
  4. 无需计划对服务器进行资本投资,所有组件均无服务器,您只需为使用付费即可。
  5. 使用云形成模板或SAM,集成可以自动化。
  6. 现有系统中所需的代码更改非常少。