微服务和数据库连接

Mar*_*yly 91 database integration microservices

对于那些将单片应用程序分解为微服务的人来说,您如何处理拆分数据库的问题.由于性能和简单性原因,我参与的典型应用程序进行了大量的数据库集成.

如果你有两个逻辑上不同的表(如果你愿意的话,有限的上下文),但是你经常对大量的数据进行聚合处理,那么在整体中你更有可能避开面向对象而是使用数据库的标准JOIN功能用于在将聚合视图返回到您的应用层之前处理数据库上的数据.

您如何证明将这些数据拆分为微服务是合理的,因为您可能需要通过API而不是数据库来"加入"数据.

我读过Sam Newman的微服务书,在关于拆分Monolith的章节中,他给出了一个"打破外键关系"的例子,他承认在API中进行连接会变慢 - 但他接着说无论如何你的应用程序足够快,它比以前慢吗?

这看起来有点油腻?人们的经历是什么?您使用了哪些技术来使API连接执行可接受?

sap*_*ens 19

  • 当性能或延迟无关紧要时(是的,我们并不总是需要它们),只需使用简单的RESTful API来查询所需的其他数据就完美了.如果您需要对不同的微服务进行多次调用并返回一个结果,则可以使用 API网关模式.

  • Polyglot持久性环境中拥有冗余是完全没问题的.例如,您可以为微服务使用消息传递队列,并在每次更改时发送"更新"事件.其他微服务将侦听所需事件并在本地保存数据.因此,不是查询,而是将所有必需的数据保存在特定微服务的适当存储中.

  • 另外,不要忘记缓存:)您可以使用RedisMemcached等工具来避免过于频繁地查询其他数据库.

  • 所有好建议,但我仍然觉得很难合理化,也许这是因为我们习惯于在数据库中进行大量处理.我们当前的应用程序具有复杂的存储过程,可以处理大量数据,然后返回一个小的结果集.在微服务架构中,我认为这些实体应该分成不同的有界上下文.我们知道当前的方法很难看,但很难证明将所有数据带回应用程序层来处理它.也许更多的非规范化或预先计算的聚合视图会有所帮助. (21认同)

mci*_*321 7

服务可以从其他服务获得某些参考数据的只读复制副本.

鉴于此,当试图将单片数据库重构为微服务(而不是重写)时,我会这样做

  • 为服务创建数据库架构
  • 在该模式中创建版本化*视图**,以将该模式中的数据公开给其他服务
  • 加入这些只读视图

这将允许您独立修改表数据/结构,而不会破坏其他应用程序.

我也可以考虑使用触发器将数据从一个模式复制到另一个模式,而不是使用视图.

*意见可以延长.如果需要更改,请创建相同视图的v2,并在不再需要时删除旧版本.**或表值函数或Sprocs.


小智 7

CQRS---Command Query Aggregation Pattern 是 Chris Richardson 对此的回答。让每个微服务更新自己的数据模型并生成事件,这些事件将更新具有来自早期微服务所需连接数据的物化视图。这个 MV 可以是任何 NoSql DB 或 Redis 或查询优化的 elasticsearch。这种技术导致最终一致性,这绝对不错,并避免了实时应用程序端连接。希望这个答案。


Jar*_*o64 5

我会将使用领域的解决方案分开,让\xe2\x80\x99s 说操作和报告。

\n\n

对于为需要来自其他微服务的数据的单一表单提供数据的微服务(这是操作案例),我认为使用 API 连接是可行的方法。您不会追求大量数据,您可以在服务中进行数据集成。

\n\n

另一种情况是当您需要对大量数据进行大型查询以进行聚合等时(报告情况)。对于这种需求,我会考虑维护一个与原始方案类似的共享数据库 \xe2\x80\x93 ,并使用微服务数据库中的事件更新它。在此共享数据库上,您可以继续使用存储过程,这将节省您的精力并支持数据库优化。

\n