【问题标题】:Trade offs using RDS cross region replicas with Entity Framework使用 RDS 跨区域副本和实体框架进行权衡
【发布时间】:2019-04-19 13:47:14
【问题描述】:

背景

我正在考虑构建 Saas 应用程序的选项,该应用程序将在三个国家/地区推出(以后可能会更多)。它将使用 RDS Postgres 在 AWS 上运行。 Entity Framework Core 是应用逻辑中的 ORM,但是这个问题可以考虑任何 ORM。

郑重声明,这是我第一次构建如此复杂的数据层,而且很难找到好的资源(我猜这是由于跨区域数据处理的困难性质)。

候选架构

我目前正在评估在澳大利亚运行主数据库的适用性,然后为美国和英国的应用服务器创建只读副本(从属)。然后显然需要将写入从美国和英国的应用服务器发送到澳大利亚主服务器。

将此架构与实体框架结合使用的三种可能方式

  • A) 具有副本连接字符串的 DbContext 从副本读取以将实体提取到上下文中。然后实体属性发生变异。为了保存这些突变,我将它们以“更新”状态附加到单独的 DbContext,使用主连接字符串进行实例化,然后该上下文在保存时执行写入澳大利亚的主服务器。
  • B) 对于所有创建/更新/删除操作,实体都通过单一上下文从主数据库读取和写入。
  • C) 对于所有操作,使用单个 DbContext,并使用副本连接字符串实例化。然后从本地副本中读取实体,然后在上下文中调用 save 时,将它们发送到副本,但 AWS 会在后台自动将任何创建/更新/删除操作路由到主数据库。

这些用例的注意事项

其中我最不喜欢A,因为当实体断开连接时,您会失去实体框架的一半功能,然后您必须手动管理它们的状态。

B 似乎是最简单的,但 C 似乎是最好的权衡(如果可能的话?),因为您获得了较低的读取延迟。但是,现在我不确定从一个数据库读取和写入另一个数据库可能出现的问题。或者由于我对这个主题的早期知识而没有看到的东西。

如果有人在这里有任何经验/建议或更好的选择,我将不胜感激?

【问题讨论】:

  • 数据需要是全局的吗?如果这类似于全球电子商务网站或涉及消息传递/游戏,那么我可以看到这是一个明确的问题,但如果每个区域大部分都自主行动,那么我会考虑在区域之间复制少量数据(超出故障转移复制)尽可能。在我有跨区域使用(海外呼叫中心访问)的地方,它是可操作的选项 B,但绝不理想。更理想的情况是在数据库层处理适当的 2 向复制,但我无法评论 RDS 的支持/选项。

标签: entity-framework amazon-web-services latency rds


【解决方案1】:

我从未尝试过,但您可以封装或从 dB 上下文继承并覆盖保存更改调用。然后,您可以将只读副本的 dbcontexts 更改跟踪器中的所有实体复制到与写入数据库相关联的内部数据库上下文。这将是相对简单和通用的,然后您可以将它们全部复制回只读副本更改跟踪器。这种方法的缺点是在各个 dbcontexts 中的更改跟踪器之间来回复制实体所需的开销。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2017-09-04
    • 2021-02-28
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    相关资源
    最近更新 更多