- 原文标题:Serverless Is the New Timeshare,作者:Shai Almog
还记得大型机吗?无服务器就好比如:我们拥有这台机器,你来我这里租借。创新往往都是在踩在巨人肩膀上诞生!
分时度假是一种源于欧洲的度假模式,就是把酒店或度假村的一间客房或一套旅游公寓,将其使用权分成若干个周次,按10至40年甚至更长的期限,以会员制的方式一次性出售给客户,会员获得每年到酒店或度假村住宿7天的一种休闲度假方式。并且通过交换服务系统会员把自己的客房使用权与其他会员异地客房使用权进行交换,以此实现低成本的到各地旅游度假的目的。
回过头看,无服务器就是新的分时度假!
我们都有健忘症。当我与年轻的开发人员谈论过去的技术时,我经常会得到茫然的目光。公平地说,有些是因为我有点"紧张"或"怪异",但有些是因为年轻的技术人员并不了解过去的技术。
举个例子:有些年轻的技术人员根本不清楚什么是两端提交(2 Phase Commit)。难道是事务管理已经不需要了吗?
银行是否不再需要一致性?如果你不在"同一页"上,该技术通过在不同的服务器之间传输事务上下文来工作。因此,一台服务器上的提交是一个多阶段过程,几乎可以保证所有服务器都成功或作为一个服务器回滚。这是相当惊人的,实际上效果相当好(显然有一些警告)。令人惊讶的是,这是通过方法调用实现的。你不需要做任何事,即使在完全不同的服务器上调用远程方法,它也能好好工作。
几年前,我与银行业的一家叫 Node-based 的初创公司交谈。他们表示,银行对与Node合作非常开放。我知道他们在更"成熟"的环境中重写他们的东西。当我使用一些"较新"的工具,如Node时,我总是对缺少的基本功能感到惊讶。当然,如果你不把我们需要的一切都融入其中,它会更简单、更小。当您放弃核心功能时,很容易构建简单的东西。
2010 年代的 NoSQL 戏剧
早在 1999 年,我正在组建自己的咨询公司,一位朋友让我见见他的老板。我去了这个办公室,"老板"说他有一个没有人想到的最惊人的想法。他们有资金,将在 6 个月内推出产品,并在第一天就向 100 万用户推出!
我:好的。什么想法?
他:我会在你报名为我们工作后告诉你。
我:我会签署 NDA(NON-DISCLOSURE AGREEMENT,即不公开协议)。
他:不。这个主意太好了。那些保密协议一文不值。你注册然后...
不知道为什么,我居然能够顶住为这家公司工作的诱惑。大概一年后,他们显然没有推出,但我的咨询公司做得很好。朋友又打电话给我了。这一次他们需要产品方面的帮助,所以我以咨询的身份去那里帮助他们。
他们的想法是在网站中内置一个聊天应用程序,这样网站的访问者就可以互相聊天。一个竞争对手已经推出,我正在咨询其他几家具有相同想法的公司。他们转而专注于与电子商务相关的聊天。但我离题了......
他们的系统表现非常糟糕。一个用户的速度就像黏了蜜糖的蚂蚁一样慢。显然,CEO 坚持他们需要在第一天就能支持 100 万用户(正如他告诉我的那样)。他们将这一点传达给Oracle公司,Oracle说他们需要一个由三台服务器组成的集群来支持这个容量。然后他们与一家面向对象的数据库供应商进行了交谈,后者承诺他们可以用一台机器处理 100 万用户。所以他们全神贯注于面向对象的数据库。当我对此表示震惊时,他们声称他们的数据非常"面向对象",因为每个用户都可以拥有多个项目......呃。
他们不了解事务边界,存储代码与所有代码混合在一起,而且速度很慢。这是不可靠的,无法理解。您可能不记得面向对象的数据库时期,但它是 2010 年代席卷我们行业的 NoSQL 时尚的先驱。在担任顾问的那段时间里,我重新观看了这个故事的重播。这一次大多数公司都成功推出了。
但后来他们发现拥有非结构化数据并不是万能的。与仅使用良好的缓存和经过良好调整的 SQL 相比,他们在性能方面获得的好处是微不足道的。部署故事非常复杂,辅助工具可能永远无法达到我们在 SQL 世界中所拥有的水平。
需要明确的是:NoSQL有自己擅长的领域,但是这些数据库常见的用途并不是很好,并且源于 RDD(恢复驱动开发)。这是我们这些已经在街区附近转过几次的人一遍又一遍地看到的模式:
- 旧技术笨重复杂
- 人们发明了一些干净简单的东西
- 忘记旧技术的存在
- 新东西过于简单化,并没有做很多基本的东西
- 重塑这些复杂性
- 新的东西变成了需要重新发明的旧的和笨重的复杂性......冲洗/重复
无服务器是新的大型机
在过去的一个月里,我做了很多无服务器的工作,我觉得这是一个很大的倒退。这是重蹈覆辙我们在 PaaS 上遇到的问题。它实际就是一个大型机。过去,我们曾经为在共享使用的大型机上运行工作付出代价。这有点像虚拟化环境,但想法相似:我们不拥有该环境。可以说这对于云 SaaS 也是如此,但无服务器将这个概念带到了很远的地方。
甚至调试体验也很糟糕。我们没有对我们的代码或基本应用程序逻辑的基本控制。我正在努力弄清楚为什么人们将它用于基本任务之外。
我能想到一个很好的用例:webhook。获取 webhook 的管道代码总是很痛苦。他们不经常触发,处理它是一件苦差事。使用无服务器功能将内容添加到数据库并完成工作可能非常简单。由于无论如何都很难调试回调,因此无服务器中糟糕的调试体验并不是一个巨大的障碍。但是对于其他所有用例,我绝对感到困惑。
人们花费大量时间检查和测量吞吐量,但仅使用一台稍大的服务器,并且只有本地调用会产生超出您可能需要的吞吐量。没有我们陷入的所有供应商捆绑。使用 Linode、Digital Ocean 等托管会节省很多钱。在上市时间方面,仅使用缓存和快速本地工具将比您可以在云中构建的任何东西容易得多。
容器是一个很好的进步,它们让这一切变得简单多了,但我们会被为了使用容器而带来的复杂性累垮,比如K8S。不要误会我的意思。K8S很棒。但我们 98% 的人并不真正需要它,也不应该使用它。如果你是一家小型的创业公司,Kubernetes 是在浪费你的时间和精力。
回到 Java 和 Rust
Java 就是一个在"健忘方面"做得很好的例子。我们有 Smalltalk,它很棒。当 Java 刚出现时,它是一种具有怪异 C 语法风格的劣质解决方案。Java 在 Smalltalk 和 C++ 中抛弃了许多伟大的想法。它采用了一些有争议的想法(检查异常、原语等)。然而它成功了。它吸引了人们的注意力;它能够利用这一点。
它最初是一种轻量级语言,可以丢弃其他平台添加的所有垃圾和过度工程。现在看看,再也没有人将其描述为"轻量级"。开发人员正忙于创建更轻、更简单的语言来抱怨 Java 的错误。成功会让他们回到我们开始的地方。一种成长太多的轻量级语言。Java 目前处于应有的位置。这是一个好的重写的少数例子之一。
Rust 似乎也是少数例外之一。它以一种全新的方式重新发明了 C。很难说它是否能长期生存。但毫无疑问,它需要在此过程中承担很多复杂性。
有意识的重塑
是什么让对现有语言或工具的重新发明成功赢取大众市场,又是什么让这些工具被搁置一旁?
SQL 起死回生,再次受到新创业公司的青睐。对于 C++ 则不能这样说。它们有何不同?
尽管缺少我们在 JVM 世界中拥有的基本功能,但 Node 和 Python 仍然很受欢迎。那是怎么回事,他们会维持这种受欢迎程度吗?他们会把这些东西加回去吗?
直到青少年时期,我们的大脑不断地增加突触。在我们十几岁的时候,我们把它们砍掉了。一种理论是,这是我们作为青少年所经历的所有变化的根源。我们需要断开不再为我们工作的东西。否则,我们只会学习父母所知道的。我们不能通过犯自己的错误来改进。再次尝试那一代人失败的事情。
结果,我们重复了错误,犯了一些新的可怕的错误。我们也取得了一些惊人的飞跃和发现。这是创新起飞的地方,工程也是如此。
我们如何区分:青少年焦虑与光明的新方向?
老实说,我们不能。作为一个年长者,当我第一次看到这些东西时,我觉得很多东西都很愚蠢。我们已经尝试过这些事情并且失败了。为什么要重复那个错误的方向?这就是创新所在。但是,如果我们仔细观察成功的尝试,我们可以看到对他们有用的东西。
Java 并非旨在结束 C++。当然,这可能是一个幻想。但高斯林设计它是为了简单和轻小。要解决非常狭窄的利基市场,请关注安全性、规模和网络。
Rust 并非旨在终结 C。它旨在使 Firefox 等项目更加稳定和高性能。
我认为,当我们最初将自己限制在一个非常小而狭窄的用例时,二次发明就像任何初创公司一样,效果很好。通过这样做并保持最初的关注点,我们可以建立一些好的东西,然后实现伟大的飞跃。