无服务器是新的分时租赁

87 阅读10分钟

m/#)

无服务器是新的分时租赁

还记得大型机吗?无服务器差不多就是这样:我们拥有机器,你在我们的大铁上出租时间。我们在进步的道路上走了一圈!

我们有共同的失忆症。当我和年轻的开发者谈起过去的技术时,我经常得到白眼。公平地说,有些是因为我有点 "紧张 "或 "奇怪",但有些是因为。嗯?真的吗?我们有这个吗?

例子是XA交易和2PC(两相承诺)。我们有一个年轻的一代,他们完全不知道这种能力,也不知道这是一个 "东西"。对交易管理的要求是否以某种方式消失了?

银行不再需要一致性了吗?如果你不在 "同一页 "上,这项技术的工作原理是在不同的服务器之间传输交易环境。因此,一个服务器上的提交是一个多阶段的过程,几乎可以保证所有的服务器都能成功或作为一个整体回滚。这是很惊人的,而且实际上工作得相当好(显然有一些注意事项)。令人惊讶的是,这通过方法调用进行。你不需要做任何事情。即使在一个完全不同的服务器上调用一个远程方法。它 "只是工作"。

几年前,我曾与银行业的一家基于Node的初创公司交谈。他们说银行对与Node的合作非常开放。我后来了解到他们在一个更 "成熟 "的环境中重写他们的东西。当我使用一些像Node这样的 "较新 "的工具时,我总是惊讶于那些基本的东西的缺失。当然,如果你不把我们需要的东西都放进去,它就会更简单、更小。当你抛弃了核心功能时,建立简单的东西是很容易的。

2010年代的NoSQL戏剧

早在1999年,我正在组建我的咨询公司,一个朋友让我去见他的老板。我去了这个办公室,"老板 "说他有一个最神奇的想法,没有人想到。他们有资金,将在6个月内推出,第一天就有100万用户!我:好的。

我:好的,是什么想法?

他说。在你签约为我们工作之后,我会告诉你。

我:我会签署一份保密协议。

他。不行,这个主意太好。那些NDA没有任何价值。你签了字,然后...

不知为何,我能够抵制为该公司工作的诱惑。一年多以后,他们显然没有启动,但我的咨询公司做得很好。那个朋友再次给我打电话。这次他们在产品方面需要帮助,所以我戴着咨询的帽子去了那里,帮助他们。

他们的想法是在网站上建立一个聊天应用程序,这样网站的访问者就可以互相聊天。一个竞争对手已经推出了,我也在为其他几家有同样想法的公司提供咨询。他们转而专注于电子商务相关的聊天。但我想说的是...

他们的系统表现得很糟糕。对一个用户来说,慢得像糖浆。显然,首席执行官坚持认为他们需要在第一天就支持100万用户(正如他告诉我的)。他们向甲骨文公司转达了这一点,甲骨文公司说他们需要一个由三台服务器组成的集群来支持这个数量。然后他们与一个面向对象的数据库供应商交谈,后者承诺他们可以用一台机器处理100万用户。所以他们就全身心地投入到面向对象的数据库中去了。当我对此表示震惊时,他们声称他们的数据是非常 "面向对象 "的,因为每个用户可以有多个项目......唉。

他们不了解交易边界,存储代码与所有的东西混在一起,因为它是所有的代码,而且速度很慢。这是不可靠的,也是无法理解的。你可能不记得面向对象的数据库时期,但它是2010年代笼罩我们行业的NoSQL热潮的前奏。在担任顾问的那段时间里,我又看到了这个故事的重演。这一次,大多数公司都成功启动了。

但后来他们发现,拥有非结构化数据并不是万能的。与使用良好的缓存和调整好的SQL相比,他们在性能上得到的好处是微不足道的。部署的故事相当复杂,辅助工具可能永远不会达到我们在SQL世界中的水平。

说白了:NoSQL有其有效的用途。但是这些数据库最常见的用途并不是很好,而是源于RDD(简历驱动的开发)。这是我们这些在这块地方呆过几次的人反复看到的一个模式。

  • 旧的技术是笨拙的复杂的
  • 人们发明了一些干净、简单的东西
  • 忘记旧技术的存在
  • 新的东西过于简单,没有做很多基本的事情
  • 重新发明这些复杂的东西
  • 新的东西变成了需要重新发明的旧的和笨重的复杂性......重复/再重复

无服务器作为新的大型机

在过去的一个月里,我做了很多无服务器的工作,我觉得这是个很大的倒退。它是我们在PaaS上所遇到的问题的翻版。它实际上是一个大型机。在过去,我们曾经为我们的工作在一个主机上运行付费,在那里我们共享时间。这有点像虚拟化环境,但想法是相似的:我们不拥有这个环境。可以说,这对云计算SaaS来说也是如此,但无服务器的概念走得很远。

甚至调试体验也很糟糕。我们没有对我们的代码或基本应用逻辑的基本控制。我很难搞清楚为什么人们在基本任务之外还要使用它。

我可以想到一个很好的用例:webhooks。为webhooks获取胶布代码总是很痛苦。它们并不经常触发,处理这些问题是件麻烦事。使用无服务器函数,只需将东西添加到数据库中并完成工作就可以了,非常简单。因为无论如何回调都很难调试,所以无服务器中糟糕的调试体验并不是一个巨大的障碍。但对于其他每一个用例,我都感到非常困惑。

人们花了那么多时间来检查和测量吞吐量,但只要使用一台稍大的服务器,只进行本地调用,就会产生超过你可能需要的吞吐量。如果没有所有的供应商捆绑,我们就会陷入其中。使用Linode、Digital Ocean等主机将节省很多钱。在上市时间方面,仅仅使用缓存和快速的本地工具将比你在云中建立的任何东西都要容易得多。

容器是一个很好的进步,它们使这个问题变得如此简单,但我们却在这个问题上掉以轻心,用Kubernetes这样的东西去追求复杂性。不要误会我的意思。K8s是伟大的。但我们98%的人并不真正需要它,也不应该使用它。如果你是一家小型创业公司,Kubernetes就是在浪费你的时间和精力。

回归Java,进入Rust

Java是一个例子,失忆的部分是好的。我们有Smalltalk,它很好。当Java出现的时候,它是一个劣质的解决方案,有着类似C语言的奇怪语法。进化的方面并不明确。Java抛弃了Smalltalk和C++中许多伟大的想法。它采用了一些有争议的想法(检查异常、原语等)。但它还是成功了。它抓住了人们的注意力;它能够利用这一点。

它开始时是一种小语言,扔掉了所有的垃圾和其他平台添加的过度工程。现在看看它。没有人再把它描述为 "小"。开发人员正忙于创造更小、更简单的语言,抱怨Java的缺点。成功会让他们回到我们开始的地方。一种发展过快的小语言。目前,Java正处于它应该处于的位置。它是为数不多的良好重写的例子之一。

Rust似乎也是那少数的例外之一。它以一种重塑C的方式,贡献了全新的东西。很难说它是否能长期生存。但毫无疑问的是,它将需要在这一过程中获得大量的复杂性。

有意识的重塑

是什么让一种现有的语言或工具的重塑成为大众市场的成功,又是什么让这种工具处于旁观状态?

SQL起死回生,在新的创业公司中再次成为热点。而C++就不是这样了。它们有什么不同?

Node和Python很受欢迎,尽管缺少我们在JVM世界中的基本东西。这是怎么回事,它们会维持这种流行吗?他们会把其中的一些东西加回来吗?

在我们十几岁之前,我们的大脑不断增加突触。在我们的青少年时期,我们削减了它们。一种理论认为,这是我们在青少年时期经历的所有变化的来源。我们需要断开那些不再对我们有用的东西。否则,我们只会学习我们父母知道的东西。我们不能通过犯自己的错误来提高。通过再次尝试在那一代人身上失败的东西。

结果是,我们重复错误,犯一些新的可怕的错误。我们也会做出一些惊人的飞跃和发现。这就是创新起飞的地方。工程方面也是如此。

我们如何区分:青少年的焦虑和光明的新方向?

老实说,我们无法做到。作为一个年长的人,当我第一次看到这些东西时,很多东西在我看来都很愚蠢。我们已经尝试过这些东西,并且失败了。为什么要重提那个破碎的方向?那是创新的所在。但是,如果我们仔细观察成功的尝试,我们可以看到什么对他们有用。

Java并不是为了结束C++而设计的。当然,它可能是一个幻想。但高斯林设计它是为了简单和小规模。为了解决一个非常狭窄的利基问题,把重点放在安全、尺寸和网络上。

Rust的设计不是为了终结C,而是为了让Firefox这样的项目更稳定、更有性能。

我认为重新发明,就像任何初创公司一样,当我们最初将自己限制在一个非常小的和狭窄的用例时,效果很好。通过这样做,并保持最初的关注,我们可以建立一些好的东西,然后飞跃到伟大。