分散数据管理-将数据库封装到微服务中


23

我最近参加了一门软件设计课程,并且最近对使用“微服务”模型进行了讨论/推荐,在该模型中,服务的各个组成部分被分成了尽可能独立的微服务子组件。

提到的一部分是,不是遵循一种常见的模型,即所有微服务都与之通信的单个数据库,而是为每个微服务运行一个单独的数据库。

可以在此处找到措辞更好且更详细的解释:http : //martinfowler.com/articles/microservices.html在“分散数据管理”部分下

最突出的部分是这样说的:

微服务更喜欢让每个服务管理自己的数据库,或者是相同数据库技术的不同实例,或者是完全不同的数据库系统-一种称为Polyglot Persistence的方法。您可以在整体中使用多语种持久性,但是在微服务中它的出现频率更高。

图4在此处输入图片说明

我喜欢这个概念,除其他外,我认为这是对维护的一项重大改进,并且有多个人在其中进行项目。也就是说,我绝不是经验丰富的软件架构师。有没有人尝试实现它?您遇到了哪些好处和障碍?


6
我不确定这个问题对程序员.stackexchange是如何超出范围的。这是关于特定技术及其优缺点的问题,以确定何时应该使用该技术。我已经看过了游览和元站点(meta.stackexchange.com/questions/68384/…)。您能否说明我该如何改善这个问题?
ThinkBonobo 2014年

Answers:


35

让我们谈谈微服务方法的正面和负面。

第一底片。创建微服务时,您在代码中增加了固有的复杂性。您正在增加开销。您将很难复制环境(例如,对于开发人员)。您使调试间歇性问题变得更加困难。

让我说明一个真正的弊端。假设考虑以下情况:在生成页面时调用了100个微服务,每个微服务在99.9%的时间内执行正确的操作。但是0.05%的时间它们会产生错误的结果。0.05%的时间有一个慢速的连接请求,例如,需要TCP / IP超时进行连接,这需要5秒钟。大约90.5%的时间您的请求可以正常工作。但是大约有5%的时间您有错误的结果,大约有5%的时间您的页面很慢。每个不可重复的故障都有不同的原因。

除非您为监视,再现等工具投入了很多心思,否则这将变成一团糟。特别是当一个微服务调用另一个时,又调用了另外几层。一旦遇到问题,随着时间的推移,情况只会变得越来越糟。

好的,这听起来像一场噩梦(不止一家公司通过这条道路为自己制造了巨大的问题)。成功只有在您清楚意识到潜在弊端并不断努力解决时才有可能。

那么那种整体方法呢?

事实证明,单片应用程序与微服务一样容易模块化。实际上,函数调用比RPC调用便宜且可靠。因此,您可以开发相同的东西,除了它更可靠,运行速度更快并且所涉及的代码更少。

好的,那么公司为什么要采用微服务方法?

答案是因为在扩展时,单片应用程序的功能受到限制。在经过如此多的用户,如此之多的请求等等之后,您到达了数据库无法扩展,Web服务器无法将代码保存在内存中的地步,依此类推。此外,微服务方法允许对应用程序进行独立和增量升级。因此,微服务架构是扩展应用程序的解决方案。

我个人的经验法则是,从脚本语言(例如Python)的代码到经过优化的C ++,通常可以将性能和内存使用量提高1-2个数量级。换一种方式到分布式体系结构会增加资源需求,但可以无限扩展。您可以使分布式体系结构正常工作,但是这样做比较困难。

因此,我要说的是,如果您要开始一个个人项目,请大胆尝试。了解如何做好。不要分发,因为(Google | eBay | Amazon | etc)是。如果您在一家大型公司中工作,请密切注意他们的运作方式,不要搞砸了。而且,如果您最终不得不执行过渡,请非常非常小心,因为您正在做的事情很容易变得非常非常错误。

披露,我在各种规模的公司中都有将近20年的经验。是的,我已经看到单一的和分布式的架构都是紧密而个性化的。基于这种经验,我告诉您,分布式微服务架构确实是您要做的事情,因为您需要这样做,而不是因为它在某种程度上越来越干净。


3
一个非常有见地的答案。谢谢您传递这种智慧。
ThinkBonobo 2014年

这是马丁·福勒Martin Fowler)(第三届)最近的演讲,涉及了其中一些观点。
Whymarrh 2014年

整体和微服务之间有办法吗?我有一个多租户的整体应用程序。一段时间后,我看到我应该按租户划分。每个租户应具有自己的应用程序实例,但它们必须共享一些数据,并且必须位于单个/中央位置。因此,我可以为此创建单独的服务。看来我将拥有几个(不是那么少)应用程序/服务。这样做听起来合理吗?
dariol

@dariol没有通过“我们在任何地方加载大型通用代码库,然后使用需要的内容”的中间立场,从单片服务过渡到完整的微服务的良好升级途径。但是,将其作为临时补丁来解决当前需求是合理的。然后开始分离真正的微服务,直到可以替换核心为止。之所以很难做到这一点,与依赖性管理有关。您将继续打,“我只需要这个,但这取决于那个,取决于那个……现在我有了整个意大利面。”
btilly 2015年

马丁·福勒(Martin Fowler)的另一个链接,是关于该主题的内容:
巨石

5

我完全同意btilly的回答,但只是想为Microservices添加另一个优点,我认为这是其背后的原始灵感。

在微服务世界中,服务与域保持一致,并由独立的团队进行管理(一个团队可以管理多个服务)。这意味着每个团队可以完全独立于任何其他服务(假设版本正确等)发布服务。

尽管这似乎是微不足道的好处,但请考虑一下Monolithic世界中的相反情况。在这里,应用程序的一部分需要经常更新,这将影响整个项目以及所有其他团队。然后,您需要引入计划,检查等,并且整个过程变慢。

因此,根据您的选择以及扩展要求,还应考虑所需的任何团队结构。我同意btilly的建议,即您启动Monolithic,然后在以后确定微服务可能从中受益的地方,但是要知道,可伸缩性并不是唯一的好处。


那是真实的。本文的其余部分特别讨论了如何通过“业务能力”鼓励细分。这绝对是关键优势。
ThinkBonobo 2014年

2

我在一个有大量独立数据源的地方工作。他们确实将它们全部放入一个数据库中,但是放入了Web服务访问的不同架构中。想法是每个服务只能访问执行工作所需的最少数据量。

与整体数据库相比,这没有多少开销,但是我想这主要是由于已经存在于隔离组中的数据的性质。

Web服务是从生成页面的Web服务器代码中调用的,因此,这很像您的微服务体系结构,尽管可能不像这个词所暗示的那样微细并且没有分布,但是它们可能是(请注意,一个WS确实调用了从第三方服务获取数据,因此那里有1个分布式数据服务实例)。进行此操作的公司对安全性的关注程度超过对扩展性的兴趣,但是,这些服务和数据服务提供了更安全的攻击面,因为其中的可利用漏洞无法完全访问整个系统。

罗杰·塞申斯(Roger Sessions)在其出色的《对象观察》时事通讯中描述了与他的“软件要塞”概念类似的东西(不幸的是,时事通讯不再在线,但您可以购买他的书)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.