是否允许使用不同微服务中的相同表?

gst*_*low 2 java database database-table spring-boot microservices

我们有 2 个微服务:

服务_A、服务_B。他们都使用相同的数据库。今天我发现我们有不同服务使用的相同表的存储库。我记得我读到由于某种原因这是一个设计错误,并尝试用谷歌搜索该信息。但不幸的是我的搜索没有成功。您能解释一下这个问题吗?

也可能是我的错误。那么不同的微服务使用同一个表可以吗?

Mar*_*nik 5

根据我的经验,在微服务之间共享相同的数据并不是一个好的做法。以下是(可能不完整的)原因:

  • 很难判断哪个微服务才是真正的数据所有者。从架构的角度来看这并不好

  • 由于契约没有明确定义,架构更改的成本要高得多。例如,如果您在一个微服务中删除列,则第二个微服务可能会停止工作,即使第一个微服务的代码已针对更改进行了调整。在其他情况下,它仍然可以工作,但性能可能会恶化(例如由第一个微服务的维护者删除索引,因为它与其中完成的查询无关,可能会导致第二个微服务的性能恶化)

  • 如果某个微服务缓存了一些数据,并且可以在同一微服务的不同实例之间保持数据同步,那么如果另一个微服务直接更新数据库并且不通知第一个微服务有关更新的信息,那么保持正确的同步可能会很棘手。变化。

  • 如果数据库是性能瓶颈,那么两个微服务都会受到影响,特别是如果这些微服务具有不同的可扩展性策略,则很难处理

  • 迁移到不同数据库(如果需要)的成本会更高,因为必须在两个微服务中更改代码

  • 如果使用 ORM,例如 JOOQ(任何需要代码生成的工具),那么不太容易理解将生成的文件放在哪里?在两个微服务中?在其中之一?如何共享数据模型

  • 通常为每个微服务构建的指标会很棘手,因为如果我们测量对数据库中某个表的访问,我们不确定另一个微服务也不会访问该表。

现在,话虽如此,毕竟建议不要使用这种做法,从技术上讲,没有理由它不起作用。所以决定权归根到底是你的。我可以从个人经验来看,在我的一个项目中,我们停止管理微服务之间的共享数据库,从我的角度来看,这是朝着正确方向迈出的一步。