【问题标题】:is it allowable to use the same tables from the different microservices?是否允许使用来自不同微服务的相同表?
【发布时间】:2019-03-19 18:11:58
【问题描述】:

我们有 2 个微服务:

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

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

【问题讨论】:

标签: java database spring-boot microservices database-table


【解决方案1】:

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

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

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

  • 如果某个微服务缓存了一些数据,并且可以在同一微服务的不同实例之间保持数据同步,那么如果另一个微服务直接更新数据库并且没有通知第一个微服务有关更改。

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

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

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

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

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

【讨论】:

  • 关于第三个项目符号,我认为这成为一个问题。通过迁移到微服务,您选择了最终一致性而不是事务性。如果您有单独的数据库,则正在传播的消息的延迟将是它会过时的时间。至于缓存,这也取决于令人满意的 TTL 以及更新的可能性。除此之外,我认为你提出的一些关于共享数据库的好观点并不好。
  • 谢谢,Will C。我的意思是另一种情况。假设拥有数据的微服务,也将其预缓存在 Redis 中。所以“读取”检查数据是否在redis中,如果数据不存在则进入数据库。如果数据已更新(再次由同一微服务更新),则广播缓存失效消息。现在,如果数据是共享的,那么另一个微服务可能会更新数据但不会通知(它怎么知道其他人预先缓存了数据)。因此,数据一致性将有很大的缺陷。
  • 同意,这实际上取决于缓存失效方案,在某些情况下可能比最初看起来更困难,例如。 TTL、LRU、数据大小等。在我看来,无论如何都不应该将数据无限期地保存在缓存中。
  • 是的,当然,你是对的,应该在一些 TTL、LRU 或任何情况下进行失效,但是,失效超出了这个问题的范围,所以我只是想把数据共享可能对我造成伤害的用例带出我的脑海:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多