自家用云之原则

作家高博 高博的世界 3天前

作为一个大学一毕业就上手做Exchange Server技术支持工程师的人,我对于应用服务器软件的认识是受过系统化训练的。在我大学刚毕业的时代,还远没有像“云计算”这么时髦的概念,而Exchange Server的授权费用也决不是普通人甚至普通企业所能负担得起的。如果切换到云计算时代的术语来说,当时的私有云服务选项可以说是极其昂贵的。想拥有一个以自有域名为后缀的邮箱,几乎唯一的选项使用公有云服务。好在公有云服务商早在十年前左右,也是2006年左右,就提供了近乎免费的选项给个人站长和小微企业来运行一些“准私有”的云服务,其中最常用的当然就是以自有域名为后缀的邮箱。部署过程中,需要用户执行的全部都是域名操作:只须把域名的MX记录解析到指定服务器,最多再加一个防垃圾邮件的TXT记录和一个用于网页登录的CName记录即可。所有其他的服务部署是完全透明的,根本不需要用户多操任何心。

话又说回来,免费最贵,这句话是非常普适的真理。凡是不要钱的服务,几乎总有伴随而来的两大问题:第一,它随时可能中止。这个很好理解,并且它在中止服务时并不一定会提前通知,而且你在这个服务上累积的任何数据都将随之而去——没有任何保证会提供任何工具供你导出数据。第二,它往往按原样提供(as is),而不会为你定制。这不是说“它不会给你提供任何配置选项”,而是说“它不会提供本来并未提供而你又恰好需要的任何配置选项”。如果它有99%都很符合你的需要,而只有1%你的需要不能被满足而这又属于无法妥协的部分,显然就得作出很痛苦的决定了。

最近这五年左右,IT业态发生了很重要的变化,这变化对于非技术人员来说可能并没有很明显的感知。但是,不在这样的时刻感知,却是非常可惜的。太多人把目光投射到所谓的人工智能或区块链等领域,可是我却认为最重要的变化来自于开源社区在这五年左右的时间内在基础软件的可用性方面下的功夫。应用软件的关注点是千变万化的,但是几乎所有的应用软件都建立在相似的基础软件之上。基础软件也没有太多神秘之处,它们无非是对一些基础协议的实现。事实上,应用软件也应该是对于一些应用协议的实现。如果软件不是对于协议的实现,而是对所谓“需求”的实现,那么这样的软件不仅是可悲的,而且几乎注定是一文不值的——即使不是一开始就一文不值,也会随着时间的推移迅速变得一文不值。而可用性,具体来说应该包括以下的几个方面:


  1. 协议的完整实现。比如,如果实现的是一个DNS服务,那么应该可以添加所有类型的记录,包括少见的SRV记录胶合记录。而DNSSECCAA记录这样的高级特性,涉及到了协议扩展部分或是其他协议,如果没有提供实现,还情有可原。

  2. 协议的正确实现。必须以符合协议定义的过程取得符合协议定义的结果,而不能只看输入和输出是否匹配。比如,如果实现的是数据存取,那么不能只校验读写结果的正确性,还要看是否在读写过程中留下的内存和外存足迹以保证达到协议规定的安全性,还要看读写的性能指标是否在协议规定的阈值范围内,等等。

  3. 协议实现基础上的交互优化。在完整和正确的实现这个基础上,谈需求才有意义。无论面对的是下游开发者,还是最终用户,对于完整性和正确性的需求都是第一位的,但是同时他们又会认为这是不言而喻的——但实际上当然不是。有90%到95%的需求都可以归结为完整性和正确性的分类中,但确实也是有5%到10%的需求可以看作是在此基础上加以进一步在交互上进行优化的。但是,能够开始在这个部分满足用户需求的都是顶尖的、一流的产品团队和开发团队了。业界需要花很多年才能建立完整性和正确性的基线,并最终将产品按照这样的基线实现出来。在此之前用户只会感觉到产品不可用,无论在无关紧要之处做得多么花哨、多么用力都毫无用处,就是因为可用性不过关。而一旦可用性达到了基线标准,精彩的产品就会如雨后春笋般冒出来了。这充分地说明:达成貌似简单可用性基线是多么的困难,而貌似困难的在此基线之上的锦上添花是多么的简单。在消息队列达到可用性之前,别说即时通讯,就连任务式操作系统的实现都注定是弱不禁风、漏洞百出的。一句话,下层的技术达不到可用性之前,上层的应用是不可能达到可用性的。今天互联网的通信可靠性,很大程度来源于TCP协议的三次握手。而一旦这个协议有了可用实现,上层的大量应用,包括现在使用得最广泛的应用层协议HTTP也就顺理成章了。


所以,毫不意外地,我们看到的成功产品无一例外地是在他们产品基础部分的可用性方面做到极致:谷歌的搜索算法、Youtube的视频播放和分发、WordPress的Web图文编辑排版插件……我们看一个网站,即使不知道它背后的工程团队实力如何,只要看一下用户注册流程,就可以有个大致判断了。一个由实力强大的工程团队建立和运维的网站,一般都支持用户注册时的身份验证、支持个人信息维护、会对输入的合法性作各种校验并协助用户输入以避免出错、在用户中断输入后可以从中断处继续输入而保存中断之前的输入、可以自动读取Gravatar、修改信息时会确保这种修改来自本人但一旦确定了本人身份就畅通无阻……凡此种种,都是可用性的重要组成部分。

回到最开始的主题,我们现在显然不可能不使用云,但是如何选择云服务才能够尽可能地避免前面提到的问题,即对于个人数据甚至服务本身缺乏掌控,以及对于服务不能很好地为自己的个性化需求而定制呢?答案从一般道理的角度来说,当然是显明的,那就是尽可能地更高程度地自行掌控所使用的云服务。可是,如果要从落地的现实性角度来说,一个更好的答案是,尽可能地自行掌控所使用的云服务到已经具备了可用性的程度为界限。说句掏心窝子的话,我们购买或租赁一种云服务或是计算设备,是为了让自己的生活更美好更轻松,而不是为了给自己添堵或是增加劳动和思想负担的。这个也当然取决于用户本身的专业能力,譬如,如果自己根本不知道怎么安装和配置Web服务器,那么显然使用虚拟主机就好过使用VPS;但如果连编译安装都可以自己搞定,那么显然使用虚拟主机就不如使用VPS。这里面起到支配作用的是木桶原理:客观的可用性,和你自己的专业能力所能掌握的可用性中,只能取较低的那个。

这么一来,选择或是自己打造日常生活和工作所使用的云服务,就有了可以依循的原则。