微服务拆分真的要谨慎

140 阅读3分钟

在探讨微服务的弊端之前,我们先来简要回顾一下微服务的优点。

灵活性方面,每个微服务都能够独立部署和更新,彼此之间互不干扰,这使得系统的更新和维护变得更加便捷高效,不会因为一个服务的变动而影响到整个系统。

可扩展性上,能够根据实际需求单独扩展某个微服务,无需对整个系统进行大规模调整,极大地提高了系统的资源利用效率和应对不同业务场景的能力。

技术多样性也是微服务的一大亮点。不同的微服务可以根据自身的特点选择最适合的技术栈,充分发挥各种工具的优势,以更好地解决特定问题。

故障隔离更是微服务的重要优势之一。一个微服务出现故障不会直接影响其他服务,从而提高了系统的整体稳定性,降低了因局部故障导致整个系统崩溃的风险。

然而,尽管微服务有诸多优点,但在实际应用中,如果使用不当,也会带来一系列问题。

首先,滥用微服务的现象屡见不鲜。有些团队在进行服务拆分时,过于随意,随便一个工作量不大的功能模块都搞成一个微服务。这样的过度拆分导致管理变得极为麻烦,运维也更加复杂,同时还会大量占用资源。比如,一个 Java 应用的微服务往往需要至少 256M 的内存,而如果采用 RPC 远程调用,原本可以整合在一个服务中的几个微服务过度拆分后,在某些业务有一定关联的情况下,调用时线程池很容易被打满。对于比较稳定的业务,其实不如直接搞个 SDK 集成,这样既能满足业务需求,又能降低系统的复杂度。

其次,调用链路太长也是一个严重的问题。如果没有专业的运维团队,且不是一个团队负责一个微服务,那么当其中一个链路出现问题时,将会带来灾难性的后果。排查问题的难度会大大增加,修复时间也会变长,严重影响系统的正常运行。

最后,不了解业务就进行微服务拆分是最为常见的错误。很多团队仅仅按照模块来划分微服务,而没有真正理解业务场景。例如,有两个接口 A-METHON 和 B-METHON,B-METHON 的调用前提是 A-METHON 调用完毕后返回正确的参数并经过一系列处理。这两个接口的流量比例大概是 98:2,大部分请求都在 A-METHON。以 Tomcat 为例,web 容器都是基于线程池 + 队列的形式,即使设置了线程数和队列大小,问题依旧存在。队列过小容易忽略 B-METHON 请求,队列过长则会导致上游超时无效请求。从功能模块上看,这两个接口在一个微服务上似乎没有问题,但考虑到真实场景,A-METHON 和 B-METHON 应该是独立不干扰的,服务应该隔离。如果基于一个服务进行改造,需要将不同的接口放在不同的队列中处理,这不仅工作量大,而且需要开发者具备较高的技术水平和更多的学习成本。如果条件不允许,最好将其拆分成一个新的服务。

总之,微服务拆分是一项非常考验架构师对业务真正理解的工作。架构师需要在项目初期就能准确预判并进行合理的规划,否则等业务上线后再发现问题进行调整,将会费时费力,严重影响项目的进度和质量。