惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
The GitHub Blog
The GitHub Blog
T
Threatpost
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
博客园 - Franky
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Apple Machine Learning Research
Apple Machine Learning Research
酷 壳 – CoolShell
酷 壳 – CoolShell
M
MIT News - Artificial intelligence
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
云风的 BLOG
云风的 BLOG
S
Security Affairs
P
Proofpoint News Feed
L
LINUX DO - 最新话题
宝玉的分享
宝玉的分享
S
Security @ Cisco Blogs
H
Hacker News: Front Page
Security Archives - TechRepublic
Security Archives - TechRepublic
Vercel News
Vercel News
Engineering at Meta
Engineering at Meta
Know Your Adversary
Know Your Adversary
Y
Y Combinator Blog
美团技术团队
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
月光博客
月光博客
量子位
博客园_首页
The Last Watchdog
The Last Watchdog
D
DataBreaches.Net
www.infosecurity-magazine.com
www.infosecurity-magazine.com
P
Privacy International News Feed
The Register - Security
The Register - Security
Schneier on Security
Schneier on Security
H
Help Net Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
V
Visual Studio Blog
Google DeepMind News
Google DeepMind News
F
Full Disclosure
C
Cyber Attacks, Cyber Crime and Cyber Security
MyScale Blog
MyScale Blog
aimingoo的专栏
aimingoo的专栏
S
Schneier on Security
L
Lohrmann on Cybersecurity
S
Secure Thoughts
Stack Overflow Blog
Stack Overflow Blog
Cloudbric
Cloudbric
Microsoft Security Blog
Microsoft Security Blog

顾宇的博客

用 AI 重启生活 初始化 MacOS 关于我 再次见面,期待相遇 演讲和分享 如何通过政策红利获利?——海南发展(SZ.002163)交易复盘 2025年的总结 2024年的总结 2023年的总结 2022年的总结 《敏捷测试价值观、方法与实践》序 【翻译】函数式编程中的领域驱动设计 【翻译】通过跟踪技术债来改进你的开发实践 【翻译】不要把测试用例自动化 【翻译】持续部署 vs 持续交付 【翻译】测试替身 【翻译】做多少测试才足够 【翻译】蓝绿部署的起源 【翻译】持续部署 【翻译】作为演进式架构的微服务架构 【翻译】gRPC 的动机和设计原则 【翻译】分布式计算谬误 采用 Multipass 管理本机虚拟 K8S 集群 博客主题升级到 Congo 2.0 【翻译】Terraform 最佳实践:模块组合 【翻译】Kubernetes 部署语言(Kubernetes Deployment Language) 通过 Vagrant 一键初始化 K8S 集群 2021年的总结 通过 Github Actions 部署 Mkdocs 文档 博客迁移到了新的 Hugo 主题 2020年的总结 2019年的总结 千人规模组织级 DevOps 演进的 9 个实践技巧 从技术雷达看 DevOps 的十年——容器技术与微服务 DevOps 模式 - 引入 DevOps 顾问 DevOps 模式 - 索引 DevOps 模式 - 定义你的DevOps 从技术雷达看 DevOps 的十年——基础设施即代码与云计算 DevOps 模式 - 采用模式语言讨论 DevOps 从星巴克店面运营学习 DevOps 从技术雷达看 DevOps 的十年——DevOps与持续交付 【翻译】微服务安全:所有应该被问到的问题 云原生下的 DevSecOps 实践 【翻译】软件定义交付宣言 微服务演进中的经验和反思 迟到的 2018 年终总结 成功微服务实施的组织演进 从第19期技术雷达看 DevOps 的发展趋势 成功微服务实施的技术演进 我们如何衡量微服务的成功? 关于四周四 AWS 架构工作坊的设计和实践 讨论微服务之前,你知道微服务的 4 个定义吗? 公有云(AWS)上的生产环境架构优化案例和迁移套路总结 公有云(AWS)上的生产环境性能分析案例 一怒之下,我又写了一个开源流量测试工具 采用 DevOps 故事落地 DevOps 测试驱动开发 Nginx 配置 云原生 DevOps 翻译-混沌工程的原则 Serverless 风格的微服务的持续交付 从最新一期技术雷达看 DevOps 的发展 关于 DevOps ,咱们聊的可能不是一回事 Serverless 风格的微服务的架构案例 提升微服务实施效率的 7 个步骤 微服务实施常被忽视的 5 个难点 你的 CI 在挖矿吗? DevOps前世今生 - 4. DevOps 的文化 DevOps发展的九个趋势 不要让你的持续集成服务器成为安全隐患 DevOps 前世今生 - 3. DevOps 的目标和核心 DevOps 前世今生 - 2. DevOps 矛盾从何而来 DevOps 前世今生 - 1. DevOps 编年史
【翻译】微服务和分布式对象第一法则
顾宇 · 2022-03-30 · via 顾宇的博客
  1. 顾宇的博客/
  2. Blogs/
  3. 【翻译】微服务和分布式对象第一法则/

本文源自 Martin Fowler 的 Bliki 上 2014 年的文章Microservices and the First Law of Distributed Objects

当我写《企业应用架构模式》一书时,我提出了一个我称之为分布式对象设计第一法则:“不要分布你的对象”。最近几个月业界对微服务的热情增加,让一些朋友对在微服务场景下对这一法则产生疑问,并且如果法则仍然成立,为什么我还要赞同微服务。

非常重要的一点就是我在第一法则中用了“分布式对象”的说法。它反映了一个在 90 年代末 00 年代初相当流行但此后(正确地)失宠的想法。分布式对象的想法是你可以设计对象并在进程内或远程选择使用相同的对象,远程则指的是在同一台机器的另外一个进程里,或者不同的机器里。比较聪明的中间件,比如,DCOM 或者一个 CORBA 实现,将会处理进程内或者远程之间的差别。因此你可以把你的系统拆分成以多个独立的进程来设计。

我对分布式对象概念的反对意见是:尽管逆可以在对象边界内封装许多东西,但逆不能封装远程/进程内的区别。 进程内函数调用很快并且总是成功(因为任何异常都是由于应用程序造成的,而不仅仅是由于进行调用的事实)。 但是,远程调用速度要慢几个数量级,并且由于远程进程或连接失败,调用总是有失败的可能。

图

这种差异的结果是 API 的设计方式不同。 进程调用可以是细粒度的,如果你想要 100 个产品价格和库存,你可以调用你的产品价格函数 100 次,另外 100 次调用库存。 但是,如果该功能是一个远程调用,你最好将所有这些批处理在到一个调用中实现,一次调用所有 100 个价格和库存。 这会导致产品对象的界面有很大差异。 因此,你不能采用相同的类(主要是和接口相关)并以进程内或远程方式透明地使用它。

与我交谈过的微服务倡导者非常清楚这种区别,而且我还没有听到他们谈论进程内/远程调用的透明性。 所以他们并没有试图做分布式对象试图做的事情,因此不违反第一定律。 相反,他们提倡通过 HTTP 或轻量级消息和文档进行粗粒度交互。

所以本质上,我对分布式对象的看法和微服务的倡导者们对微服务的看法并不矛盾。 尽管存在这种基本的非冲突,但现在还需要提出另一个问题。 微服务意味着小型分布式单元通过远程连接进行通信,这比单体应用要多得多。这不违反第一定律的精神,即使它符合它的字面意思吗?

虽然我承认有正当理由为许多系统进行分布式设计,但我确实认为分布式是复杂性的助推器。 粗粒度的 API 比细粒度的 API 更尴尬。 你需要决定如何处理远程调用失败以及一致性和可用性的后果。 即使你通过协议设计最小化远程调用,仍然需要更多地考虑它们的性能问题。 在设计单体应用时,你必须担心模块之间的职责划分,而对于分布式系统,你必须担心模块之间的职责分配和分布因素。

虽然小型的微服务确实更加简单,但我担心这会将复杂性推向服务之间的通信,由于通信的不明确,因此更难发现问题。 当你必须跨越远程边界进行重构时,会更加困难。 微服务倡导者吹捧你会从异步通信中降低耦合,但异步是另一个复杂性助推器。千篇一律的扩展允许你在不增加分布式复杂性的情况下处理海量请求。

因此,我对分布式持谨慎态度,我是倾向整体设计。 鉴于此,为什么我要花费大量精力来描述微服务并支持倡导它的同事? 答案是因为我知道我的直觉并不总是正确。我不能否认许多团队已经采用了微服务方法并取得了成功,无论是像 Netflix 和(可能)亚马逊这样的知名公共案例,还是我在 Thoughtworks 内外都与之交谈过的各种团队。 我天生就是一个经验主义者,相信经验证据胜过理论,即使这个理论比我的直觉要好得多。

并不是说我认为这件事已经有定论了。在软件交付中,成功是一件很难定义的事情。尽管像 Netflix 和 Spotify 这样的组织已经大肆宣传他们早先在微服务上的成功,但也有像 Etsy 或 Facebook 这样的例子在单体架构上取得了成功。无论团队认为自己使用微服务多么成功,唯一真正的比较是违反事实的——如果他们使用单体的方式构建应用会更好吗?微服务方法只出现了相对较短的时间,所以我们没有太多证据来自十年前的遗留微服务架构。但可以将微服务与我们非常不喜欢的那些古老的单体应用进行比较。并且可能存在我们尚未确定的因素,这意味着在某些情况下单体应用更好,而其他情况则有利于微服务。鉴于在软件开发中收集证据的困难,即使在多年过去之后,也很可能不会做出有利于其中一个或另一个的令人信服的决定。

鉴于这种不确定性,像我这样的作家能做的最重要的事情就是尽可能清楚地传达我们认为我们已经学到的教训,即使它们是矛盾的。 读者将自己做出决定,而作为作家,我们的工作是确保这些决定是明智的,无论他们落在架构决策的哪一边。

(完)