微服务和数据库连接
对于将单一应用程序拆分为微服务的人来说,您是如何处理拆分数据库的内容的。 我工作的典型应用程序为了性能和简单的原因做了大量的数据库集成。
如果你有两个逻辑上不同的表(如果你愿意的话,有界的上下文),但是你经常在大量的数据上进行聚合处理,那么在整体上你很可能会避开面向对象,而是使用数据库的标准JOINfunction在将聚合视图返回到应用层之前处理数据库上的数据。
你如何certificate将这些数据分解成微服务是必要的,否则你将被要求通过API“连接”数据而不是数据库。
我读过Sam Newman的Microservices一书,在关于分裂Monolith的一章中,他举了一个“打破外键关系”的例子,他承认通过API进行连接会变慢 – 但是他继续说无论如何,你的应用程序是足够快的,这是否比以前慢?
这似乎有点滑稽? 什么是人们的经历? 你使用了什么技术来使API连接可以接受?
-
当性能或延迟无关紧要时(是的,我们并不总是需要它们),只需使用简单的RESTful API来查询您所需的其他数据就足够了。 如果您需要对不同的微服务进行多次调用并返回一个结果,则可以使用API网关模式。
-
在Polyglot持久性环境中拥有冗余是完全正确的。 例如,您可以为您的微服务使用消息传递队列,并在每次更改内容时发送“更新”事件。 其他微服务将侦听所需的事件并在本地保存数据。 所以,而不是查询你保留所有必要的数据适当的存储为特定的微服务。
-
另外,请不要忘记caching:)您可以使用Redis或Memcached之类的工具来避免频繁查询其他数据库。
服务可以拥有其他服务的某些参考数据的只读副本。
鉴于这一点,当试图重构一个单一的数据库到微服务(而不是重写),我会的
- 为该服务创build一个数据库模式
- 在该模式中创build版本化*视图**,以将数据从该模式公开到其他服务
- join这些只读的意见
这将允许您独立修改表格数据/结构而不破坏其他应用程序。
我可能会考虑使用触发器将数据从一个模式复制到另一个模式,而不是使用视图。
*意见可以延长。 如果需要重大更改,请创build相同视图的v2,并在不再需要时删除旧版本。 **或表值函数或Sprocs。