对于那些将单片应用程序拆分为微服务的人来说,您如何处理拆分数据库的问题。由于性能和简单性原因,我参与的典型应用程序进行了大量的数据库集成。
如果你有两个逻辑上不同的表(如果你愿意的话,有界的上下文),但你经常对大量的数据进行聚合处理,那么在整体结构中,你很可能避免面向对象,并且而是使用数据库的标准JOIN功能处理数据库上的数据,然后将聚合视图返回到您的应用层。
您如何证明将此类数据拆分为微服务是合理的,因为您可能需要加入这些数据。数据通过API而不是数据库。
我已经阅读过Sam Newman的微服务书,在关于拆分Monolith的章节中,他举了一个例子,说明了打破外键关系"他承认在API中进行连接的速度会慢一些 - 但他接着说,无论如何你的应用程序是否足够快,它是否比以前慢得多?
这看起来有点油腻?人们的经历是什么?您使用了哪些技术来使API连接可以接受?
答案 0 :(得分:18)
当性能或延迟无关紧要时(是的,我们没有 总是需要它们)使用简单的RESTful API是完美的 查询所需的其他数据。如果你需要做多个 调用不同的微服务并返回一个你可以使用的结果 API Gateway模式。
在Polyglot persistence环境中拥有冗余是完全没问题的。例如,您可以为微服务使用消息传递队列,并在每次更改时发送“更新”事件。其他微服务将侦听所需事件并在本地保存数据。因此,不是查询,而是将所有必需的数据保存在特定微服务的适当存储中。
答案 1 :(得分:5)
服务可以从其他服务获得某些参考数据的只读复制副本。
鉴于此,当试图将单片数据库重构为微服务(而不是重写)时,我会
这将允许您独立修改表数据/结构,而不会破坏其他应用程序。
我可能还会考虑使用触发器将数据从一个模式复制到另一个模式,而不是使用视图。
*可以扩展视图。如果需要更改,请创建相同视图的v2,并在不再需要时删除旧版本。 **或表值函数,或Sprocs。
答案 2 :(得分:3)
CQRS ---命令查询聚合模式是Chris Richardson的回答。 让每个微服务更新自己的数据模型并生成事件,这些事件将更新具有来自早期微服务的所需连接数据的物化视图。该MV可以是任何NoSql DB或Redis或elasticsearch,它是查询优化的。这种技术导致最终的一致性,这绝对不错,并避免实时应用程序端连接。 希望这个答案。
答案 3 :(得分:1)
我会将使用范围的解决方案分开,比如运营和报告。
对于那些为需要来自其他微服务的数据的单个表单提供数据的微服务(这是操作案例),我认为使用API连接是可行的方法。您不会获取大量数据,您可以在服务中进行数据集成。
另一种情况是,您需要对大量数据进行大量查询以进行聚合等(报告案例)。为此,我会考虑维护一个共享数据库 - 类似于您的原始方案,并使用来自您的微服务数据库的事件进行更新。在此共享数据库上,您可以继续使用存储过程,这将节省您的工作并支持数据库优化。
答案 4 :(得分:0)
在微服务中,您可以创建差异。阅读模型,所以例如:如果你有两个差异。有限的上下文,有人想要搜索这两个数据然后有人需要从两个有界上下文中侦听事件并创建一个特定于应用程序的视图。
在这种情况下,需要更多空间,但不需要连接,也不需要连接。