Mar*_*yly 91 database integration microservices
对于那些将单片应用程序分解为微服务的人来说,您如何处理拆分数据库的问题.由于性能和简单性原因,我参与的典型应用程序进行了大量的数据库集成.
如果你有两个逻辑上不同的表(如果你愿意的话,有限的上下文),但是你经常对大量的数据进行聚合处理,那么在整体中你更有可能避开面向对象而是使用数据库的标准JOIN功能用于在将聚合视图返回到您的应用层之前处理数据库上的数据.
您如何证明将这些数据拆分为微服务是合理的,因为您可能需要通过API而不是数据库来"加入"数据.
我读过Sam Newman的微服务书,在关于拆分Monolith的章节中,他给出了一个"打破外键关系"的例子,他承认在API中进行连接会变慢 - 但他接着说无论如何你的应用程序足够快,它比以前慢吗?
这看起来有点油腻?人们的经历是什么?您使用了哪些技术来使API连接执行可接受?
sap*_*ens 19
当性能或延迟无关紧要时(是的,我们并不总是需要它们),只需使用简单的RESTful API来查询所需的其他数据就完美了.如果您需要对不同的微服务进行多次调用并返回一个结果,则可以使用 API网关模式.
在Polyglot持久性环境中拥有冗余是完全没问题的.例如,您可以为微服务使用消息传递队列,并在每次更改时发送"更新"事件.其他微服务将侦听所需事件并在本地保存数据.因此,不是查询,而是将所有必需的数据保存在特定微服务的适当存储中.
服务可以从其他服务获得某些参考数据的只读复制副本.
鉴于此,当试图将单片数据库重构为微服务(而不是重写)时,我会这样做
这将允许您独立修改表数据/结构,而不会破坏其他应用程序.
我也可以考虑使用触发器将数据从一个模式复制到另一个模式,而不是使用视图.
*意见可以延长.如果需要更改,请创建相同视图的v2,并在不再需要时删除旧版本.**或表值函数或Sprocs.
小智 7
CQRS---Command Query Aggregation Pattern 是 Chris Richardson 对此的回答。让每个微服务更新自己的数据模型并生成事件,这些事件将更新具有来自早期微服务所需连接数据的物化视图。这个 MV 可以是任何 NoSql DB 或 Redis 或查询优化的 elasticsearch。这种技术导致最终一致性,这绝对不错,并避免了实时应用程序端连接。希望这个答案。
我会将使用领域的解决方案分开,让\xe2\x80\x99s 说操作和报告。
\n\n对于为需要来自其他微服务的数据的单一表单提供数据的微服务(这是操作案例),我认为使用 API 连接是可行的方法。您不会追求大量数据,您可以在服务中进行数据集成。
\n\n另一种情况是当您需要对大量数据进行大型查询以进行聚合等时(报告情况)。对于这种需求,我会考虑维护一个与原始方案类似的共享数据库 \xe2\x80\x93 ,并使用微服务数据库中的事件更新它。在此共享数据库上,您可以继续使用存储过程,这将节省您的精力并支持数据库优化。
\n