architecture - 如何将与数据库关联的一个后端服务解耦为两个独立的服务?
问题描述
我有一个大的 MySQL 数据库 D_Big,里面有一堆数据。我还有一个服务 S1,它带有从这个数据库读取或写入的 API。例如,一个 API 可能会从数据库中获取一些东西。另一个可能会向数据库写入一行。等等
我还有一个小型辅助数据库 D_Small,S1(并且只有 S1)正在读取和写入该数据库。我想不理会小型辅助数据库,但我想更改从大型 MySQL 数据库 D_Big 访问数据的方式。
我想让它访问大型 MySQL 数据库的唯一方法是通过 API 调用第二个服务 S2,它也可以访问大型数据库。当 S1 想要 D_big 中的数据时,它必须调用 S2 中的 API,这将返回 D_Big 中的数据。因此,我想删除 S1 对 D_Big 的直接依赖。
有什么好的方法可以做到这一点?有哪些提示/建议?最直接的方法似乎是将 S1 中直接访问 D_Big 的每个 API 调用替换为 S2 中相应 API 的 API,该 API 只执行与 S1 直接执行的数据库访问完全相同的数据库访问。例如,假设我们在 S1 中有这些 API:
API_1 从 D_Big 中的 table1 返回列 [foo, bar, baz]
API_2 将值 foo 写入 D_Big 中的 table2
API_3 从 D_Big 中的 table3 返回列 *
我只是将这些替换为:
S1 中的 API_1 调用 S2 中的相应 API,该 API 从 D_Big 中的 table1 返回列 [foo, bar, baz]
S1 中的 API_2 调用 S2 中相应的 API,API_2 将值 foo 写入 D_Big 中的 table2
S1 中的 API_3 调用 S2 中的相应 API,其中 API_3 从 D_Big 中的 table3 返回列 *
但是,理想映射不是一对一的情况呢?就像您应该组合 API 时一样(例如,S1 中的一个 API 调用 S2 中的两个不同 API 以获取所需的数据,或者 S1 中的两个不同 API 调用 S2 中的相同 API 但具有不同的参数)?
您如何制作一个良好的接口,将两个服务与过去的共享数据源 (D_Big) 分离?假设 S1 和 S2 都使用基于 Java/XML/Spring 的系统通过 API 调用传输数据。
解决方案
如果时间允许,这似乎是转向 CQRS 的绝佳机会。使用 CQRS,您将拥有两个 API——一个用于写入,一个用于读取。您不会遇到多个 API 调用的问题,因为 API 代表的是业务理念(即用例),而不是离散的实体访问。您的前端一次只能提交一个用例,因此只有一个 API 调用。在服务器端,您的端点控制器将进行尽可能多的数据库读取或写入,以实现业务理念。
CQRS 是一种出色的架构模式,可以根据需要增长。为了在这里总结,我不得不省略很多重要的细节。在开始重构之前,努力了解该模式是值得的。
推荐阅读
- c# - 根据 ObservableCollection 中项目的属性使用 CanExecute 创建命令
- windows - 更改 cygwin 主路径
- javascript - 如何从 nodejs 服务器 WebRTC 在 VLC 上创建链接
- swiftui - swiftUI如何创建气泡效果?
- react-native - 使用云端设备发布到 App Store
- javascript - 'PUT' 对数据库的请求正在添加错误的值
- python - 需要参数python的函数
- sql - 将相同的值插入到具有与其他表不同的值的表中
- r - 在 R 中使用 group_by 后的进一步数据操作
- spring - 错误 HTTP 状态 405 ?使用 GCP 负载平衡器时不允许的方法