有关分布式、虚拟化和微服务给这个世界带来什么的讨论。
序章
前几个月朋友推荐买了一本书,浙大的《Docker容器与容器云 第二版》。空闲的时候翻了翻,了解了一下基本的概念,由于其他事情耽搁了,最近又拿起来翻了翻,觉得索然无味。于是装了个登录用户名为ubuntu的RHEL7的虚机,搭了个Docker环境,搜搜谷歌,看看文档,敲敲示例,突然有一天把知识点都串起来烤了烤,味道还不错。
题目是叫“后现代主义的编程时代”,后现代主义来源于达达主义。达达主义产生于一个新旧世代更替非常明显的时代。有人把达达主义的产生和文艺复兴带来的社会变革相提并论,然而作者个人觉得文艺复兴的地位要比达达主义高。两个事情都是从怀疑批判经典开始,推动艺术的发展,开辟新的艺术天地,乍一看似乎没法对比,答案就在文章里。
我们现在所处的时代几乎就是一个编程的时代。我们的生老病死都记载在晶片和磁簇里,我们一颦一笑的影像穿越线缆,千千万万的耳朵隐藏于蛛网上;我们用大型计算机预测天气,我们用大型数据计算你的购物喜好,我们用对撞机毁灭地球。这种种的背后,都会有一群群勤奋的码农在使用一种叫“编程”的技术来维护世界的和平。
有人说编程其实是一门科学,只不过常常被认为是艺术。科学本身对大众来说是枯燥的,你还记得DNA上的CGAT(胞嘧啶,鸟嘌呤,腺嘌呤,胸腺嘧啶)是什么吗,你还记得血型的遗传规律吗,你还记得中子的半衰期吗。但是科学本身给大众带来的兴奋,是和祂的枯燥成反比的。当你看着你天天被大数据算计给你的新闻里七大妈八大姑家长里短验DNA狗血故事的时候,当你天天浇水但是马上就完蛋的多肉植物想着明天再去某宝淘几颗相对好养的时候,当你按照养生习惯天天打太极做事情推三阻四还是被查出来腰椎间盘突出的时候,你会长呼一口气,科学真奇妙。编程也是如此,一个个奇怪的字符,争先恐后的跳到中央处理器,然后就控制着你的收入你的支出你的收支平衡,你会长吸一口气,谁花了我的钱。蓦然回首,才发觉一把宝剑架在你的脖子上,你老婆的金牙在黑暗中闪着耀眼的光芒。
第一章 华山论剑之——集中式和分布式
华山派练剑有两个学派,气宗和剑宗。到底是气宗好还是剑宗好,金庸这个老狐狸并没有给出答案,但是他借了岳不群的嘴巴说,一开始剑宗好,但是练了气以后呢,过二十年就是气宗好了。其实这很像集中式和分布式之争。
我们知道,现代机都是依赖于一颗中央处理器和内存的架构作为计算单元,即是CPU和内存是强耦合的,这有什么问题,三岁小孩子都能倒背如流的常识。然而这个问题很严重,所有的孙悟空都不能逃出如来佛的掌心,以代码表示就是:
foreach(Monkey monkey in Collection["孫武空"]){
if(monkey.MaxJumpDistance > tathagata.Palm.Width) return Story.HappyEnd();
}
极强的耦合性导致了为了处理数据的实效,所有的外设IO都设计成让中央处理器不费吹灰之力就能交互,显卡映射到内存,游戏手柄映射到内存,鼠标映射到内存,喇叭也映射过去,打开的文件也映射到内存里面去。在那个DOS时代大家肯定对怎么节省内存耿耿于怀。这些思想在那个时代没有人会觉得不正常,除了一个没法避免的事情出现——
生产力提高导致的社会分工。
想想一个极简的例子,计算a+b的值,并存储在c上。对于看文章的各位肯定不用洪荒之力就能写出类似于:
c = a + b;
的句子。考究一点的同学还会给这个句子加上一个main函数,并且使用scanf和printf的库函数来让这段代码运行的看起来完美一点。会汇编的同学立即指出,a、b、c其实都是内存,在计算的时候,这些值都在中央处理器的寄存器里面。
社会分工后,需求发生了变化,a其实是本市医院当年年度出生的婴儿总数量,而b则是市政厅今年购买的垃圾桶数量,c则变成了税务局要求统计的一项指标。你现在需要从医院获取a的数据,从市政厅获取b的数据,然后计算加法后,将c的值送给税务局。天晓得税务局为什么要这么做,但是他们肯定有理由的。
看到这里你肯定大呼上当,为什么和分布式、集中式一点关系都没有。这是很正常的,我在写科学散文,散文的精要就是形散神不散。
你想了想,觉得这个需求只要搭建一台服务器,使用专线网络或者公共网络来访问医院、市政厅、税务局的数据接口,你就能拿走实施费用了是吧?事情远远没有这么简单,“我们是谁?甲方。我们的需求是什么?不知道。我们什么时候要?现在。我们什么时候付款?验收后!”
还好你遇到了稍微靠谱一些的甲方,他们在你喝下两斤旺仔牛奶盒子装的五粮液后告诉你,其实他们还承担着市县乡街道各级指标的收集,上面的公式其实变为:
c = a FUNC b;
其中FUNC既不是加法,也不是减法;既不是积分,也不是微分;既不是∑,也不是∏。你又散了两包黄金叶和三十七包九五至尊之后,甲方偷偷的告诉你,这个FUNC其实是中华商场提供的黑盒。看你傻呆呆的楞在那里,甲方告诉你,所有的数据要在5分钟内处理完并且上送到税务局;如果做不完的话,你得按照合同金额的555555555555555555555555555555%支付违约金。(我在擦键盘)
现在你面临的问题是,一大堆数据要查询,一个黑盒子要调用,并且处理完还得在有限时间内上送结果。你抱着试试看的态度反编译了黑盒,发现这个jar包里的api只做了一件事:
Thread.sleep(300000); //呵呵
你想骂人,但是你灵光一现,想起了独孤九剑。