微服务:难民-单体架构的边界在哪里

下面的文章是微博上某博主探讨微服务架构时的看法,大意是单体架构的边界比想象中宽广的多,和我的有些想法很契合,特转发至此。 Martin Fowler 开的公司是做技术咨询和外包服务的,最热衷这种新名词了 (不搞点新概念怎么开展新业务)。还有现在的云厂商也很乐于推微服务架构,多好的卖机器卖服务的机会啊,一个原本只用单机部署的系统鼓吹一下搞成微服务拆成 N 个系统后又可以多赚几倍的钱了。 我在传统行业做了 10 几年的企业应用,从地市级到省级系统,只要是面向内部用户的,就没有一个是单体系统满足不了的。微服务架构更适合那种用户规模起来之后的互联网企业,从阿里辞职出来之后,过去 8 年,我再也没参与过基于微服务架构的系统了,因为没有真实的需求。 我当初就是在阿里的中间件团队工作,微服务架构的系统所需要的三架马车全在我们组,包括服务框架、分库分表中间件、消息中间件。这三架马车我就参与了其中两架: 服务框架、分库分表中间件。 服务框架当初阿里的叫 HSF,除了最基本的 RPC 功能也有软负载,然后还得有 config server 做服务的注册与发现,搞到后面你还得做一个分布式调用链跟踪系统,为了存储分析调用链中的日志又得引入一整套的大数据领域的技术栈 (当年我们全网每天的调用量是 2000 亿起步)。 现在开源的微服务技术栈可以选用 Apache Dubbo 做 RPC 框架,但是服务注册与发现你还得配合其他的 (比如 Apache Dubbo 官方推荐用 zookeeper)。顺便说个八卦: Apache Dubbo 就是当年在阿里内部跟我们组的 HSF 竞争失败后开源出来的,现在能流行也是无心插柳。自从阿里云这家子公司做成了之后,发现微服务可能是门好生意,Dubbo 这个弃儿居然还有不少用户,然后又把 Dubbo 捡起来了,至于阿里云上面是套 Dubbo 的壳卖 HSF 的企业版还是别的动机我就不多猜了。 除了 Apache Dubbo,现在 java 平台上的微服务技术栈还有比较火的 Spring Cloud 全家桶,我只看过,但没有用过。vert.x 也有微服务的套件,我也没有用到真实的商业系统中。说白了就是没有几个系统需要上微服务。 以上说的还只是解决 API 层面的调用问题,你以为一个采用微服务架构的系统有了 Dubbo 和 Spring Cloud 就够了吗?错错错,session 管理在阿里都需要一个专门的小中间件,为了解决不同系统的消息传递问题,又得引入消息中间件。 还有最难的,数据层的问题怎么搞?你告诉我拆成了 N 个系统后还搞一个共享数据库?逗我玩呢。微服务架构的系统在数据库的层面基本上多是 OLTP 类型的,现在开源成熟的面向 OLTP 的分布式数据库可以说没有,别跟我提国内某司的 NewSQL 数据库,那东西在 OLTP 场景下的性能简直不能看,所以现在还是会用 MySQL 这样的传统关系数据库,然后搭配分库分表中间件来解决微服务架构系统的后端存储问题,拆分后的子系统都有自己的数据库集群。...

November 4, 2020 · 1 分钟 · ming

微服务:雄伟巨石可以成为城堡

DHH 在 2020.04.08 发表了一篇最新博客 “The Majestic Monolith can become The Citadel”,继续讨论对微服务的一点看法,提出了一种与微服务相对的 “城堡” 模式。在推上也引发了不少关注,搜关键字 “The Majestic Monolith” 就能看到很多。这是原文链接:https://m.signalvnoise.com/the-majestic-monolith-can-become-the-citadel/ 我按照个人理解,粗略翻译了一下。大家可以对照原文来看,如有翻译不准确的地方,请在回复中提出来。 大多数的 Web 应用应该都是从一块 “雄伟巨石” 开始其生涯的:一个单一代码库做其所需的所有事儿。与之相对的是一群 Service,不管这些 Service 是 “微” 还是 “大一点” 的,都试图把应用切成孤岛,每个仅做整体工作的一小片而已。 大多数的 Web 应用都将以 “雄伟巨石” 形态在其一生中都能持续提供很好的服务。这种模式的上限很高,比大部分人幻想成为架构师时所能想象的要高得多。 但是,尽管如此,“雄伟巨石” 仍然会有需要一些帮助的那一天。也许你正在与庞大的团队打交道,其中的人们相互磕磕绊绊(即使这样,别忘了有很多非常大的组织依然在使用 monorepo 模式!)。或者你终究会遇到极端负载下的性能或可用性问题,这在 “雄伟巨石” 的技术选择范围内无法轻松解决。你的第一直觉将是改进 “雄伟巨石” 直到其能够应对问题,做了这一切而没成功时,你才会考虑下一步。 下一步就是 “城堡”,保持 “雄伟巨石” 在中心位置,但用一系列的 “基地” 对其支援,每个分离出应用程序职能一个小的子集。“基地” 使得 “雄伟巨石” 得以卸下其不同行为的一个切片,(这些不同行为)要么是出于组织原因,要么是出于性能或实现的原因。 一个在 Basecamp 的这种例子是我们的旧 chat 应用 Campfire。它是在 2005 年构建的,那时 Ajax 和其他 JavaScript 技术都还很新颖,所以它基于 polling 而不是现代 chat app 目前使用的长连接。这意味着每个客户端连接到系统都会每三秒触发一个请求来询问 “是否有我的新消息?”。大多数这些请求都会回答 “不,没有”,但为了获取这个答案,你仍然不得不对请求进行身份验证,查询数据库,等等。...

November 4, 2020 · 1 分钟 · ming