托管在 AWS 上以访问多个外部数据库的应用程序

Application hosted on AWS to access multiple external DB's

这个问题并不仅仅与应用程序开发有关,而是从架构的角度来看的。假设一个应用程序必须托管在 AWS 上,这将需要来自多个外部第 3 方持有的数据库的通信(不一定要在 AWS 上,可以是他们自己的数据中心或主机托管)——也许一个客户会使用 MySQL,另外一个MSSQL,或者Oracle等

因此,这些外部数据库中保存的数据可能会经常更改,并且应用程序应始终检索更新后的数据。我能想到的一种方法是使用另一个 RDBMS 数据库(从我们这边)专门存储来自外部数据库的所有这些数据,并使我们的数据库始终保持同步。但我不确定这是否是实现此目标的好方法。

或者我是否需要使用Redshift之类的数据仓库工具来存储所有实时同步的数据,然后在我们的应用程序中使用DW数据?根据此处的架构师的说法,实现此目标的良好解决方案是什么,主要是使用多个外部数据库连接和同步?

对于您的用例,我建议创建一个 REST API,它将用作移动应用程序的后端服务。

有几个原因,您不应该使用您的移动应用程序直接连接到后端数据库。

安全风险

  • 需要公开访问数据库,这是一个很高的安全风险。
  • 在移动应用程序中存储数据库访问凭据存在另一个安全风险。

性能

  • 如果您有后端服务,则直接与数据库通信可能会导致数据传输方面的性能问题,该后端服务可以在根据查询从不同来源合并后以最佳方式发送和接收成批数据。
  • 还可以通过 API 或后端服务获得服务器端缓存的好处。

通过您的 API 获得数据的通用视图,您可以连接到多个数据库并相应地检索数据,还可以在您的 API 中处理身份验证和授权。

下图说明了在 AWS 中使用无服务器技术堆栈(API 网关和 Lambda)构建一个 API 可以连接到多个后端数据库的架构。

有几点需要强调

  • 您可以根据业务逻辑的复杂程度决定使用单个 Lambda 函数还是多个 Lambda 函数。
  • 建议将所有 Lambda 放在 VPC 中,然后通过 VPN 连接到您的远程数据中心,这样数据库访问就不需要公开。

从那里开始:

So basically you need to build a mobile application, which requires to retrieve data from different databases located from different datacenters both for read and write

最便宜的方法是让应用程序直接连接到这些数据库,这样您根本不需要额外的基础设施。缺点:安全性(你必须在 mob.client 上存储数据库凭据)和无法实现集中式缓存。

选项 2:修改您的应用程序以使用位于 AWS 的中介,该中介依次连接到缓存和原始数据库。或许API网关可以派上用场。如果您需要中介非常快,我建议不要使用 lambda,而是使用具有自动缩放功能的 ec2。需要一些金钱和时间。

选项 2.5:除了选项 2 之外,您还可以将数据库从属作为只读副本添加到您的 AWS 帐户。更快但更贵。

选项 3:将数据库移动到 AWS 并将只读副本留在旧位置。从商业角度来看可能是不可能的。

选项 4:在 ec2 上的原始数据库和数据库之间设置主-主复制(RDS 不允许主-主 afaik)。缺点:我不确定稳定性。

不要忘记在传输过程中加密您的数据库流量,默认情况下它不受 SSL 保护。