知识卡片

集群才是正确的扩展方式:复制整个应用,而非拆分对象

普通读书笔记卡

内容

既然分布对象设计第一定律是”不要分布使用对象”,那么真正需要利用多处理器资源提升性能时该怎么办?大多数情况下答案是集群:在每个处理器上都完整部署一整套应用对象,并在其他节点上复制同样的副本,而不是把客户、订单、产品这些组件拆开、各自扔到不同节点上。这样做的好处是双重的——每个处理器上的对象调用仍然是纯粹的本地调用,运行速度不受影响;同时因为不再需要考虑跨进程分布,可以继续放心使用细粒度接口来设计对象,编程模型更简单、系统也更容易维护。这与文章开头那位架构师的设计形成了鲜明对比:他的方案是把一个应用拆成分布式的碎片(客户对象在一个节点、订单对象在另一个节点),表面上看起来是在”分布式扩展”,实际上制造了大量原本不需要存在的远程调用;集群方案则是把同一个完整的应用整体复制多份,节点之间不需要互相远程调用,各自独立处理各自分配到的请求。可迁移启发:”水平扩展”和”拆分服务边界”是两件完全不同的事——前者靠复制无状态的整体来分摊负载,后者靠切分职责边界来分离关注点,混淆这两者、误以为”把一个东西拆成分布在不同机器上的碎片”就是在做水平扩展,恰恰是最容易踩的坑。

参考来源

- 位置:《企业应用架构模式》第一部分"表述"之"第7章 分布策略"之"7.2 远程接口和本地接口"(源文件:_epub-src/OEBPS/Text/000046.html) - 结论依据:原文说明"这种情况下,怎样有效利用多处理器资源呢?大多数情况下是使用集群系统……在每一个处理器上都部署所有的对象并在其他几个节点上复制它们。这样一来,每个处理器上的对象只需用到本地调用,从而运行更快。还可以使用细粒度接口来设计对象,从而得到更简单的编程模型和更好的可维护性",直接支撑本卡结论。 - 原始内容:在每一个处理器上都部署所有的对象并在其他几个节点上复制它们。这样一来,每个处理器上的对象只需用到本地调用,从而运行更快。