微服务与单片架构

use*_*383 76 microservices

我做了一些关于微服务的阅读,我有点兴趣.看起来像是有趣的概念.但我想知道,使用微服务而不是单片架构有什么优缺点,反之亦然.

当微服务更合适时,哪里更好地采用单片架构.

Pau*_*son 149

这是一个非常重要的问题,因为有些人被微服务的所有嗡嗡声所吸引,并且需要考虑权衡.那么,微服务的好处和挑战是什么(与单片模型相比)?

优点

  • 可部署性:由于更短的构建+测试+部署周期,更灵活地推出新版本的服务.此外,还可以灵活地使用特定于服务的安全性,复制,持久性和监视配置.
  • 可靠性:微服务故障仅影响微服务及其消费者,而在整体模型中,服务故障可能会影响整个整体.
  • 可用性:推出新版本的微服务需要很少的停机时间,而在整体中推出新版本的服务则需要通常较慢的重启整个整体.
  • 可伸缩性:每个微服务都可以使用池,集群,网格独立扩展.部署特性使微服务与云的弹性非常匹配.
  • 可修改性:使用新框架,库,数据源和其他资源的灵活性更高.此外,微服务是松散耦合的,模块化组件只能通过他们的合同访问,因此不太容易变成泥球.
  • 管理:应用程序开发工作分为较小的团队和更独立的团队.
  • 设计自治:团队可以自由地使用不同的技术,框架和模式来设计和实现每个微服务,并且可以独立地更改和重新部署每个微服务

挑战

  • 可部署性:有更多的部署单元,因此需要更复杂的作业,脚本,传输区域和配置文件来监督部署.(出于这个原因,持续交付和DevOps非常适合微服务项目.)
  • 性能:服务更可能需要通过网络进行通信,而整体内部的服务可能会受益于本地呼叫.(出于这个原因,设计应该避免"聊天"的微服务.)
  • 可修改性:合同的变更更有可能影响部署在其他地方的消费者,而在整体模型中,消费者更有可能在整体内部,并将与服务同步推出.此外,提高自治性的机制(例如最终一致性和异步调用)会增加微服务的复杂性.
  • 可测试性:集成测试更难设置和运行,因为它们可能跨越不同运行时环境中的不同微服务.
  • 管理:管理操作的工作量增加,因为有更多的运行时组件,日志文件和点对点交互来监督.
  • 内存使用:通常在每个微服务包中复制多个类和库,并增加总体内存占用.
  • 运行时自治:在整体中,整体业务逻辑是并置的.使用微服务,逻辑分布在微服务上.因此,在其他条件相同的情况下,微服务更有可能通过网络与其他微服务进行交互 - 这种交互会降低自治性.如果微服务之间的交互涉及改变数据,则对事务边界的需求进一步损害了自治.好消息是,为了避免运行时自治问题,我们可以采用诸如最终一致性,事件驱动架构,CQRS,缓存(数据复制)以及将微服务与DDD有界上下文对齐等技术.这些技术并非微服务所固有的,但几乎每个我读过的作者都提出过这种技术.

一旦我们理解了这些权衡,我们还需要知道另一个问题来回答另一个问题:哪个更好,微服务还是整体?我们需要知道应用程序的非功能性需求(质量属性要求).一旦您了解了性能与可扩展性的重要性,您就可以权衡权衡并做出有根据的设计决策.

  • 我不太明白这个评论,但关键在于比较实现和部署为一组微服务的相同功能的性能与作为同一整体内的一组组件的性能.在其他条件相同的情况下,在这种情况下,由于本地调用的可能性而不是微服务所需的远程调用,因此性能(具体的响应时间)往往在单片方法中更好. (4认同)

Kaj*_*Kaj 71

虽然我对微服务世界比较陌生,但我会尽量回答你的问题.

当您使用微服务架构时,您将增加解耦和关注点分离.因为你很快就拆分了你的应用程序.

这导致您的代码库更易于管理(每个应用程序独立于其他应用程序以保持运行).因此,如果您这样做,将来更容易向您的应用程序添加新功能.如果使用单一体系结构,如果您的应用程序很大,那么它可能会变得非常困难(并且您可以在某个时间点假设它).

部署应用程序更容易,因为你是单独建立独立的微服务,并在不同的服务器上部署它们.这意味着您可以随时构建和部署服务,而无需重建应用程序的其余部分.

由于不同的服务很小并且单独部署,因此扩展它们显然更容易,其优势在于您可以扩展应用程序的特定服务(使用单片式扩展完整的"事物",即使它只是一个特定的部分)应用程序负载过重).

但是,对于不打算变得太大而无法管理的应用程序.最好将它保持在单片架构上.由于微服务架构存在一些严重的困难.我说部署微服务更容易,但这与大型单块相比只是如此.使用微服务会增加将服务分发到不同位置的不同服务器的复杂性,您需要找到一种方法来管理所有这些服务.如果你的应用程序变大,构建微服务将在长期帮助你,但对于较小的应用程序,它更容易保持整体.

  • 我的经验(我已经在两种代码库上工作)是单片更简单:代码库更容易管理(它的更少!),更容易添加功能(你只需添加它们一个地方,不必为所有东西定义进程间的API),并且部署它更容易(你只是部署到一组服务器,而不是六种类型).@ Paulo的答案是一个更完整的图片! (17认同)

Wil*_*l C 11

@Luxo是现货.我只是想提供一个微小的变化,并带来它的组织视角.微服务不仅允许应用程序解耦,而且还可以在组织层面上提供帮助.例如,该组织可以分成多个团队,每个团队可以在团队可能提供的一组微服务上进行开发.

例如,在像亚马逊这样的大型商店中,您可能拥有个性化团队,电子商务团队,基础设施服务团队等.如果您想进入微服务,亚马逊就是一个非常好的例子.Jeff Bezos要求团队在需要访问共享功能时与其他团队的服务进行通信.请参阅此处以获取简要说明.

此外,来自Etsy和Netflix的工程师在微软服务与Twitter上的monolith的当天也进行了一场小小的辩论.辩论的技术性稍差,但也可以提供一些见解.