知识卡片
微服务粒度下界的三个维度及粒度过细的反噬
内容
“微服务越小越好,最好一个REST Endpoint对应一个服务”是常见的误解,粒度 太细会在三个维度反噬系统。性能维度:进程内方法调用耗时在0到数百个 时钟周期之间,跨服务调用要经过网络传输+参数序列化+结果反序列化,耗时 到毫秒级别——这是数量级的差距,服务粒度必须考虑网络耗时和方法本身 执行时间的比例,把字符串处理这类琐碎功能单独设计成一个微服务就是不 合适的,这要求微服务在功能设计上应该是完备的。数据一致性维度:每个 微服务有自己独立的数据源,多服务协同可以靠最终一致性方案解决,但如果 某些数据必须强一致,就应该聚合在同一个微服务里而不是硬启用XA事务—— 参与协作的微服务越多,XA事务的可用性就越差,这要求微服务在数据一致性 上应该是内聚(Cohesion)的。服务可用性维度:微服务之间是松散耦合的 依赖关系,不该假设被调用方绝对可用,如果两个微服务彼此依赖对方才能 正常工作(注意是”彼此”,单向依赖是必定存在、可以接受的),就应该合并 成同一个微服务,这要求微服务在依赖关系上应该是独立的。综合三个维度, 微服务粒度的下界是:独立——能独立发布部署运行测试;内聚——强相关的 功能和数据在同一服务处理;完备——至少包含一项业务实体及其完整操作。
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第16章"向微服务迈进"16.3节
"边界:微服务的粒度"(源文件:_epub-src对应OEBPS/Text/chapter181.xhtml)
- 结论依据:原文从性能、数据一致性、服务可用性三个角度分别论证微服务
粒度过细的具体风险(网络耗时数量级远超方法调用、XA事务随参与者增多
可用性下降、彼此依赖的服务应合并),并总结出独立、内聚、完备三条
下界要求,直接支撑本卡片结论。
- 原始内容:微服务粒度的下界是它至少应满足独立——能够独立发布、独立
部署、独立运行与独立测试,内聚——强相关的功能与数据在同一个服务中
处理,完备——一个服务包含至少一项业务实体与对应的完整操作。