为什么学习分布式?答:自我技能提升、遇到具体的业务场景有更多的解决思路;
如何系统的学习分布式?答:从实际问题中学习、引伸出知识点、由点及面、学习一些经典的分布式系统案例、以输出倒逼输入(以写博客倒逼学习);
什么是分布式系统?
Web集群是不是?Redis集群是不是(通过Redis客户端做一致性Hash)?
实践当中是遇到了什么问题才引出分布式这个概念?什么情况适用于分布式?不用分布式行不行、有什么可替代方案?
单机的硬件配置是有上限的,当计算量大到一定程度时,通过提升单机硬件配置已经不能很好的提升处理效率时,就需要分而治之,将大计算量的任务切分成若干个小任务、这些小任务被分到多台机器上执行、最后将多台机器的执行结果进行合并;分布式的目标是为了提升效率吗?
分布式解决了效率问题后,又带来了哪些新的问题?如何拆分、拆分成几个执行单元比较合适、执行单元之间如何分配任务、如何将不同执行单元的结果合并起来、一个执行单元出故障如何保证整体结果的正确?
如何拆分?原来一个业务系统负责商品列表展示、商品详情展示、用户下单、支付、订单详情展示、退款一整套操作,但是当用户访问量大到一定程度时,我们需要将应用由单机变为集群,但是当访问量再大到一定程度时,增加集群机器量已经不能很好的解决问题,什么问题?比如,商品列表的请求量是其它接口请求量的几十倍,单机的大部分资源(线程、CPU等)都消耗在商品列表接口上,而后续下单等接口却在排队等待,这便降低了系统的吞吐量,这个时候我们需要将商品列表接口与下单流程拆分开来,一部分机器处理商品列表展示、一部分机器处理下单流程,将整个业务流程拆分的过程便是分布式,我们是以整个系统吞吐量的角度进行拆分,同样我们可以将整个系统拆分成商品相关、用户相关、促销相关、下单相关、支付相关等服务;
如何进行请求的路由?通过请求URL进行路由,比如list接口请求商品列表机器、order接口请求下单机器,通过nginx等一些反向代理便可以做到;如何避免单机请求量过大,可以设置路由策略,比如hash、均分;
如果下单服务的一台机器故障了(比如磁盘问题),如何保证整个系统的可用性?将下单服务单元部署成集群,一台机器故障通过路由策略将请求打到正常的机器上;那么如果每台机器都维护了订单的状态,我们如何保证不同机器状态的一致性呢?我们在写入某一机器的同时、同步更新集群中其它的机器;但是同步的过程是需要时间的,如何保证系统的快速响应?
这就引出了分布式系统中的一个经典理论:CAP;
学习分布式有什么用?在实际场景中如何使用?
https://www.zhihu.com/question/23645117 http://www.cnblogs.com/xybaby/tag/distributed%20system/ http://kabike.iteye.com/blog/2168852 https://www.cnblogs.com/captainlucky/p/4720986.html https://blog.csdn.net/lxf310/article/details/22398655 http://www.yunweipai.com/archives/17357.html
这里要讲的不是硅谷的那个风投公司Y-Combinator,而是讲函数式编程中的一个概念;
说起Y Combinator,不得不提不动点,什么是不动点,比如一个求平方的函数
f(x) = x^2
那么当x为0和1的时候,就叫这个函数的不动点,即f(x) = x;
在函数式编程中,函数f的不动点是另外一个函数z
即f(z) = z
,Y Combinator是一个特殊的函数,它能返回函数f
的不动点,Y(f) = f(Y(f)) = f(z) = z
;
没用,业务开发中这东西确实没用;
说实话,我现在也不知道这个东西有啥用,平时该写if else
还是要写if else
,该写for each
还写for each
;
理论上讲,Y Combinator是要实现匿名函数自身的递归调用,也就是在没有函数名的前提下函数自己调用自己;
此处我就以《The Little Schemer》中的推导过程来说明,因为作者这种苏式问题式的讲解已经十分通俗易懂,有兴趣的可以直接看这本书;
;Y Combinator
;声明一个叫array_length的函数,入参为列表l
(define array_length
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 (array_length (cdr l)))))))
; 计算空列表
(array_length '())
; 计算有三个的列表
(array_length '(a b c))
; 将array_length的定义去掉,变成一个匿名函数
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 (array_length (cdr l))))))
;此时如果入参是空列表,返回0,如果非空列表则报错,因为我们还没有声明array_length函数;
((lambda (l)
(cond
((null? l) 0)
(else (+ 1 (? (cdr l)))))) '())
;那么我们匿名函数可以这么写
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 (? (cdr l))))))
;此时我们将?用上边的匿名函数来替换,此时传为长度为1的列表,结果为1,即(+ 1 0),因为里边的那层匿名函数计算结果为0
(lambda (l)
(cond
((null? l) 0)
(else (+ 1
((lambda (l)
(cond
((null? l) 0)
(else (+ 1 (? (cdr l))))))
(cdr l))))))
;计算长度小于等于2列表,我们需要再多嵌套一层
(lambda (l)
(cond
((null? l) 0)
(else (+ 1
((lambda (l)
(cond
((null? l) 0)
(else (+ 1
((lambda (l)
(cond
((null? l) 0)
(else (+ 1 (? (cdr l))))))
(cdr l))))))
(cdr l))))))
;抽象,可计算长度为0的空列表
((lambda (len)
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 (len (cdr l)))))))
+)
;可计算长度为1的列表
((lambda (len)
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 (len (cdr l)))))))
((lambda (len)
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 (len (cdr l)))))))
length))
;可计算长度为2的列表
((lambda (len)
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 (len (cdr l)))))))
((lambda (len)
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 (len (cdr l)))))))
((lambda (len)
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 (len (cdr l)))))))
length)))
;无非是抽象出来的函数自己调用自己,再次抽象,将调用者主体抽象出来.可计算长度为0的空列表.
;(并且最后一层传给mk-length的函数根本用不上,所以传任意参数都可以,我们将length替换为+依旧可以这执行)
((lambda (mk-length)
(mk-length +))
(lambda (len)
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 (len (cdr l))))))))
;可计算长度为1的列表
((lambda (mk-length)
(mk-length
(mk-length +)))
(lambda (len)
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 (len (cdr l))))))))
;可计算长度为2的列表
((lambda (mk-length)
(mk-length
(mk-length
(mk-length +))))
(lambda (len)
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 (len (cdr l))))))))
;上边那么多层嵌套无非是为了一层层递归直至列表长度为0,既然最后一层mk-length传递的参数可以是任意的,我们将它自己传递过去
;同样如上边,这个只能执行空列表,大于0的列表会报错,为什么呢?因为此时的参数len对应的入参mk-length,mk-length要接收的参数是函数而不是列表(cdr l)
((lambda (mk-length)
(mk-length mk-length))
(lambda (len)
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 (len (cdr l))))))))
;所以为了支持长度为1的列表,我们给len传一个函数,可以是任意的,比如+
((lambda (mk-length)
(mk-length mk-length))
(lambda (len)
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 ((len +) (cdr l))))))))
;此时将+替换为len自己,我发现可以执行长度的列表,那么此时这个函数就可以计算任意长度的列表了
;函数执行时不断递归,直至(cdr l)为空列表
((lambda (mk-length)
(mk-length mk-length))
(lambda (len)
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 ((len len) (cdr l))))))))
;不过还有一个问题,函数此时不再是这种形式(len (cdr l),而是(len len)这种,我们再进行抽象,将(len len)抽象出来
((lambda (mk-length)
(mk-length mk-length))
(lambda (len-two)
((lambda (len)
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 (len (cdr l)))))))
(lambda (l)
((len-two len-two) l)))))
;再将中间函数主体也抽象出来
((lambda (len)
((lambda (mk-length)
(mk-length mk-length))
(lambda (len-two)
(len (lambda (l)
((len-two len-two) l))))))
(lambda (len)
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 (len (cdr l))))))))
;再将变量名简化一下
((lambda (f)
((lambda (x) (x x))
(lambda (x)
(f (lambda (l)
((x x) l))))))
(lambda (len)
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 (len (cdr l))))))))
;到这里Y Combinator也出来了
(define Y
(lambda (f)
((lambda (x) (x x))
(lambda (x)
(f (lambda (l)
((x x) l)))))))
;执行结果为4
((Y
(lambda (len)
(lambda (l)
(cond
((null? l) 0)
(else (+ 1 (len (cdr l)))))))) '(a b c d))
在07年之前,移动互联网的市场一直都处于萌芽期,缓慢发展,那时候老牌手机厂商三强:诺基亚、摩托罗拉、爱立信,皆从功能机起家,最典型的手机设计便是实体键盘,当时也会有一些小应用之类的,但是相比之后的智能手机还是天差地别,也正是因为在功能机上的优势拖累了这些老牌厂商在智能手机上的脚步;
此时另一巨头微软冀希望于PC操作系统移植到手机上,保持操作系统领域的优势,遗憾的是:微软碰到了Apple和Google这两个对手;
07年6月29日,苹果正式发售IPhone,对于这一划时代的产品,市场给出了巨大的良好反应,仅第一个年头里就卖出了612万部,从此苹果便引领了智能机的潮流;
08年Google开放了Android操作系统,当时外界并不看好,因为此时还是诺基业的天下-Symbian系统在智能手机市场中占有绝对优势,但是随着智能手机潮流的兴起,各手机厂商需要一款开源的手机操作系统去承载各种应用,而Apple和微软都是闭源的领导者,再加上Google的开源推动,Android在开源手机操作领域开始独领风骚。
从PC时间,Apple就是高冷的代名词,主要是价格高,别人一台电脑几千,Apple得小一万,所以PC市场主流还是以微软阵营为首,到移动互联网时代,IPhone依旧采取这种策略,走高端路线;
而Google在没有自己硬件制造的前提下,将Android系统开放出来,HTC、三星、小米、华为各种厂商都可以用,从智能手机量上来看,肯定是Anroid市场份额更高,但是Android的体验确实也差IOS一截;
作为微软这个PC操作系统时代的老大,在移动浪潮下反而背负了历史包袱,被Apple和Google弯道超车,即使收购了诺基亚。
在PC时代,BAT三座大山之后,很难再有巨头成长起来,但是移动浪潮的到来,给了不少创业者机会;
程序员出身的雷军,在一翻调研之后,押定智能手机制造,小米诞生了,预计今年在香港IPO,又成就了一波造富神话;
曾经创业屡败屡战的王兴,在团购领域也站稳了脚跟,并将商业版图四处扩大;
起步最晚的程维,认准出行市场,也成一方霸主;
而此时,BAT三家各有各的忧虑,百度动作最慢、在11年顶峰之后便遇到了危机,在移动端没有拳头产品,并且移动App的兴起更是将搜索流量一点点的瓜分,公司频繁变更战略方向;阿里作为电商的老大,倒没受到多大冲击,只需要将PC产品移值到手机端;腾讯的幸运之处在于早年得到了个懂产品又懂技术的张小龙,微信作为移动时代即时通讯工具,迅速打败的更早问世的米聊,有了这张移动船票,真是上面插根扁担都能开花,更何况是在张小龙手里;
这个时代创业成本更低,各种创业公司风起云涌,更是造就不少工作岗位;
这是最坏的时代、也是最好的时代,说他坏是因为生活成本、高房价的压力,说他好是因为我们正处于变革的时代浪潮之中,把握好机遇、一切皆有可能;
所有走过的路,都是必经之路;所有少走的弯路,以后都会加倍的走回来,看看这些互联网公司由盛转衰的过程,对于我们个人发展是一个警醒。
当2000年的钟声敲响,这个时候已经创办的互联网公司,大多数还没找到自己的盈利模式。
不过,在雅虎经过开放和免费的商业模式探索之后,被证明是一条可行之道,大家纷纷效仿,短短几年时间里,门户网站之风席卷全球,全世界流量最大的网站都是门户;同样,在中国也不例外:新浪 搜狐 网易三大门户,这个时代一般称为互联网1.0时代,此时门户网站就像是报纸一样、是一种新闻媒介,通过广告获得收入,信息流单一地从门户网站或二级三级网站向用户推送,用户可以通过留言板发言。
此时的Google还在摸索自己的盈利模式,还是给雅虎做外包;
此时的Amazon还不知道盈利方向在哪儿;
经历了互联网泡沫的调整,死掉一大批骗钱的网站后,互联网重新焕发出生机,不但没死反而更有活力,正如前文所说:在事物的成长过程中生病不一定是坏事、反而提高了身体的免疫力。
从此,互联网当初的星星之火、开始形成燎原之势。
在Google逐渐站稳搜索领域的角根之后,探索出AdWords进行商业化,这家搜索巨头又将触角伸向了互联网的方方面面;
01年,一个叫维基百科的网站悄悄上线,它仅仅是一个平台,内容由广大的用户生产并免费提供给用户,真正是仅之于民用之于民,这一举打破了传统门户网站的模式,信息流由单向的传递变成了广大用户可以互相生产、交互;之后的03年,MySpace成立,SNS流行起来,互联网2.0已悄然到来,各种互联网产品相继问世,占领用户的个人电脑,这些产品也极大的提升了用户的便利,比如地图、视频、twitter等等。
当看到了Google由搜索外包转向为广大用户提供搜索服务,百度也同样调整了自己的方向,并且李厂长力排众议,推出竞价排名,这一模式快速为百度带来了盈收、利润,但是之后也一直被诟病。
腾讯在经历了互联网泡沫之后,还是依然看不到自己的盈利方向,虽然用户注册、活跃度都在快速增长,还只能是摸着石头过河、时不时为移动、电信做些外包赚点外快,并且腾讯危机意识比较强,只要互联网出现什么火爆产品、他都去copy一份,腾讯影音、腾讯音乐、QQ空间、腾讯电脑管家、腾讯各种游戏等等,经过多年探索,终于在游戏这条道路上找到了方向,从此一发不可收拾,以广大用户群为基础、推广各种游戏,以至于中国游戏共一石,腾讯独占7斗。
阿里起步较晚,最开始还在跟ebay进行斗争,此时的ebay家大业大,花起钱做推广可是毫不手软、在各大门户封杀淘宝,而马云以众多中小网站推广的方式来曲线救国,以本地化C2C的模式打败ebay,稳坐电商头把交椅。
中国互联网三分天下之势渐成,人称BAT。
就在互联网大局初定之时,另一波浪潮即将升起,这注定又是一堆财富制造神化,并且没赶上浪潮的企业势必要掉队。每一次浪潮都是弯道超车的机会。
说互联网是第三次工业革命一点也不过分,他改变了我们生活的方方面面。
不管是企业还是个人,不论多么成功,都不能停止学习、不能停止进步,否则终有被淘汰的一天。
种树最好的时机有两个,一个十年前,一个是现在。
回到1994年,那时候网景才刚刚成立,然而在斯坦福大学的两个学生却迷上了互联网,因为网络上的内容太多、不容易归类查找,他们就做了一个分类网站,大多数网民那时候都会遇到这样的问题、有问题就有需求、有需求就有访问量,在年底,这个分类网页就有了百万的PV,过完元旦,这两个学生就为这个网站注册了域名,雅虎,当然,这两个学生是:杨致远和大卫·费罗,至1996年雅虎便上市,上市当天市价最高达5亿美元,而在去年一整年中,雅虎营业额才130万美元,亏损63万美元,资本真是疯狂。
95年,杰夫·贝佐斯在车库中创建了亚马逊;
95年,彼埃尔·奥米迪亚创建了ebay;
96年,拉里·佩奇和谢尔盖·布林已经开始研究搜索引擎排名算法;
96年,维斯格、瓦迪、高德芬格开发出ICQ;
…
短短两三年内,决定互联网商业几大重要模式(电子商务、门户广告、搜索引擎、即时通讯)的公司相继诞生,再加上资本的推动,这波浪潮一发不可收拾。
在大洋彼岸,中国互联网也逐渐起步,一些有眼光又有执行力的青年开始了探险:
天下文章一大抄、天下创意也一大抄,本身中国互联网起步便晚,所以美国先发展起来的,无一例外、都被copy到中国,史称C2C-Copy To China。
第一次互联网浪潮奠定了BAT;
在经历了几年疯狂发展,凡是带点互联网概念的股票上市,都能带来数倍的溢价,从98年10月到2000年3月10日,纳斯达克指数从1419上涨至5049,一些明星股如ebay等更是上涨10倍之多,物极必反,何况是此时的互联网并没有找到好的盈利渠道,一切概念还炒作背后还是需要业务基本面支撑的,自3月10日之后,泡沫被刺破,至01年又回到1423点,不少互联网公司纷纷申请破产。
难道互联网概念真是的资本鼓吹下又一个庞氏骗局、它有可行的商业模式吗、它真的能给投资人带来利润吗?
以今天的角度来看,门户广告、在线游戏、搜索引擎这些都是可行的商业模式,都是可以带来利润的,但是在一个产业的摇篮期,谁又能站在上帝视角看世界呢?
任何产业的发展都不是一帆风顺的,就像一个人的成长,总会有大病小病、磕磕绊绊,每一次的生病让我们抵抗力更强、每一次挫折让我们意志更坚强,互联网泡沫也一样,在大家都疯狂的时候来一记当头棒喝-让大家记得生意还是要回归到生意的本质:盈利,一切新概念新事物不管说的多高大上,还是要落地还是要拿出实实在在东西。
正如人的生老病死一样,ARPANet也有自己的生命周期。
随着世界格式的变化,1990年苏联解体,冷战结束,而ARPANet曾经因冷战而生,如今也随冷战而亡。
连国防部都不再需要ARPANet了,那么互联网的前途也就这么暗淡了么?
早在冷战结束前,为了促进科学研究,美国国家科学基金这个组织被建立起来,与此同时NSFNet诞生,NSFNet逐步成为促进互联网发展的重要角色,毕竟ARPANet作为军方的网络应用有限,而在各高校科研等领域,网络的应用更广泛,虽然NSFNet新成立,但是它使用的技术、协议等都是之前已经提出来的,所以NSFNet跟ARPANet也算是一脉相承。
随着冷战的渐渐熄火,NSFNet扛起了互联网进步的大旗,NSFNet并不像之前的ARPANet仅供政府、研究人员使用,它是面向全社会的,越来越多的机构加入其中,越开放越强大。
随着加入NSFNet的内容越来越多,人们发现浏览网上内容的方式不够简单方便、文本协议不统一,于是万维网协议被蒂姆·伯纳斯·李提出来,两年后,世界上第一个网页被创建。
1993年,首款图形界面的Web浏览器Mosaic问世,它首次将图片和文字同时展现一个界面上,级大的提升了用户的浏览体验。
随后Mosaic的开发者马克·安德森创办了网景通信公司,重写了Mosaic浏览器,并命名为“Netscape Navigator”,并且通过免费策略迅速占领用户市场,到1995年,成立不足两年且未盈利的网景公司在纽交所上市,市值最高达27亿美元。
正是在1995年,微软感到了网景公司的威胁,推出IE浏览器、与Windows捆绑销售,之后开始了与网景长达数年的浏览器战争,这是后话暂且不表。
浏览器的出现,使得互联网以更方便的形式普惠大众,之前的互联网可以说是“王谢堂前燕”,而今得以“飞入寻常百姓家”。
天下熙熙、皆为利来,天下攘攘、皆为利往。
伴随着网景公司的上市,资本看到了一条更快的暴富路径:扶持新型互联网公司上市,哪怕是公司没有盈利、甚至还没有找到盈利点,从此资本的投入一发不可收拾,风投成为一种新的职业。
同样在1995年,ebay和amazon上线运营,虽然它们也还没找到盈利方向,但是它们带来了购买、消费的新体验。
在大洋彼岸,中国互联网的那些弄潮儿:杭州师范的大学老师马云、宁波的电信员工丁磊都决定离职出去闯一闯。
起初互联网从没想过能在民用领域有多大用途,但是人们的趋利性使用它风光无限。
知识真的可以改变命运吗?看一看马克·安德森,通过一个软件,快速积累起巨大的财富,并且这种案例之后多年还会不断上演。
如果把互联网也视为一门生意的话,那么这门生意和开餐馆、办工厂有什么不同吗?无非的起点要高一些,你需要懂一些软件相关的技术,这些技术便是知识、所以知识改变命运;开餐馆、办工厂也是需要技术、这也是知识,所以说知识改变命运。
那么只有知识,可以改变命运吗?不见得,有了知识,还需要有去试错的勇气、决心,百折不挠的毅力、再加一点点的运气,有知识是改变命运的前提,知识的获得需要行万里路、读万卷书。
在提出了网络通信要去中心化的理论模型之后,如何将理论付诸实践,毕竟这个世界不缺有想法的人,缺少能将想法变为现实的人。
DARPA这个日后引领半个多世纪世界科技浪潮的组织,从此开始搭建新一代网络工程。但是摆在面前的一大问题是,当时军方的电脑的终端、操作系统、文件系统多种多样,互不统一,比如陆军使用DEC电脑、空军使用IBM电脑、海军使用Honeywell电脑,如何将这些电脑互联互通?
时势造英雄,麻省理工学院的拉里-罗伯茨在1966年入职DARPA,经过一年多的潜心研究,提出通过一个中间层来解决不同电脑之间的互通(其实就是路由器的前身),而通信数据传输问题,根据之前保罗-巴朗等人的分布式网络描述,似乎也可以行得通,于是新一代网络-阿帕网(ARPANet)开始着手搭建,而罗伯茨也被称作为阿帕网之父。
冬去春来,又经历一年研发、调试,在1969年10月29日,当晚10半,加州大学洛杉矶分校与斯坦福实现了对接,之后两个月,阿帕网搭建完毕并投入使用,新时代即将到来。
当时DARPA在负责人鼓励创新,允许研发人员研究他们感兴趣的项目,可以不用考虑其军事价值,并且与一些高校进行合作,所以网络互通在高校中开始应用起来,并且在1971年,电子邮件也被开发出来;之后法国也开始建立自己的网络项目,虽然并未成功;1973年,阿帕网第一次横跨大西洋:连接到英国伦敦。
之后数年内,越来越多的应用被开发出来,电子邮件、BBS、游戏、查询软件等等,都相继面世。
虽然网络还只是局限在一小部分范围内,但是依赖阻挡不住大家的创新激情。
网络协议诞生,经过多年研究,1974年,TCP/IP协议被提出,并且美国国防部决定公开协议的核心技术,接下来的两年,网络快速发展起来,阿帕网已经拥有60多个节点。不过对于协议的标准之争一直是暗流涌动,在1986年,OSI标准对TCP/IP发起了挑战,但是OSI只是一个模型、并无实现,再一次现实(TCP/IP)打败了理想。
到此时,互联网依旧还是在学校、军事等领域发展,对普通大众的影响并不大。
现如今互联网在改变我们生活的方方面面,而当时,大家还都认为互联网只是在一些特殊领域有用。
为什么TCP/IP能打败OSI?民间战胜了官方,当我们有一个idea的时候,先不要高兴太早,能拿出来货真价实的东西才行,理论+实践,缺一不可。有一个不完善的可用版本要强于一个完善的空头理论十倍。
20世纪50年代开始的美苏争霸,在1957年苏联发射卫星后,美国政府陷入的极大恐慌,在时代的焦虑之下,美总统艾森豪威尔向国会提出建立DARPA(国防高级研究计划署)。
DARPA的一个目标就是希望,即使美国遭受了苏联的打击,美国的军事系统也不会因此瘫痪,但是,从当时的情况来看,这基本上是不可能的,因为当时的通信系统都是需要连接到一些中心交换点,如果这些中心交换点受到打击,那么整个通信网络就会被切分为几个独立的孤岛,显然DARPA面临着巨大的挑战。
传统的中心化方式行不通,那还有什么方案可行呢?去中心化?怎么个去中心化法?对于当时承接这个任务的兰德公司,也是极为头疼的一件事情。
保罗-巴朗,一位受雇于兰德公司的技术工程师,提出了分布式通信的的概念,通信中各节点都可以相互连接,没有中央节点控制,如果某节点故障,其它节点依旧可以互相通信;并且保罗还发表了一篇《On Distributed Communications》文章,随后看来,这奠定了互联网通信架构。
冷战之中,谁能料想到焦虑之下的一个决定,会渐渐推动互联网的发展。
冷战还未结束,互联网趋势已然有了星星之火。
站在2018的视角,我们能够在网上订餐、打车、看电影、聊天、游戏,这一切的一切,对当时的人们来说,都是不可思议的事情。
如果没有冷战,那么会不会有互联网?
原始社会,人们为了提高生存能力,会形成部落,一个部落就像一个互联网,部落里每一个人就像一台计算机,人与人之间的分工、合作就需要交流(通信),所以产生了语言、文字这些沟通方式;而计算机之间需要通信,于是有了网络、有了互联网。
个人认为,如果没有冷战,互联网一样会发展,只是可能走的路径会不一样,因为当时银行、金融、学校等一些场景也会用到计算机,也会遇到计算机之间通信的问题,通信问题的解决,不管以何种方案,都会被提上日程。所以互联网发展的根本原因是社会的快速发展需要这种技术,而冷战只不过是更早更迫切的遇到了这个问题,对于日后轰轰烈烈的互联网运动,冷战并非是决定性力量,算是一个催化剂。
这篇文章位置预留,放在半年后的2018-11-10号写;
当下焦虑的时代,如何才能减少焦虑,从现在做起,哪所一件小事:坚持、坚持、再坚持,日积月累,这便是个人的护城河;
正如电影《生死狙击》中那句话:慢就是稳、稳就是快;
slow is smooth, smooth is fast.
工作当中会接手一些别人交接给自己的业务系统,排查问题时经常需要去查看业务日志,但是往往业务日志不全,这就影响了定位问题的效率,然后开始完善业务日志、再上线、再重现问题,其实想想,业务系统打些日志,这不应该是很平常的事情么,为什么一些工作几年的同学都做不到呢?
难道只开发、不维护?谁又能保证开发的功能上线之后没有问题?通过这件事,我在想,作为一名开发人员,如何才能叫了解一个业务系统呢?
要完成业务提的需求、理解业务;要了解系统解决的是什么问题,此处可以来个一句话话描述,本系统在公司各业务中处于一个什么位置?系统是给谁用的?再之后了解这个系统提供的有哪些功能?系统上下游都是谁?系统要保证SLA是多少?系统哪些功能是核心功能、哪些是非核心功能?
出现问题要快速定位、并解决;
定准问题工具,日志 脚本 诊断工具;
日志这个事情,在学编程的过程中,没有人会告诉我们打日志,但是工作中,如何打日志却很能看出一个人工程素质(经验),如果平时有排查问题的情况,多多少都离不开日志,软件是有生命周期的,开发阶段只占一小部分,更长的时间我们是在维护,想想很多Java教程为了简单,都用System.out.print来演示,其实对于新手存在误导,如果一个入职的新人写代码,里面充斥着各种System.out.print或一行日志都没打,那很可能实际工作经验没多少;当然,对于一些QPS大的业务,线上实际不会打太多日志,但是却可以通过日志级别进行调整、采样上报;
熟悉系统架构,代码逻辑实现,是计算型应用、存储型应用?定时任务何执行?是否存在单点问题?是否可水平扩展?是否存在SQL注入、被爬等安全风险?用户敏感信息是否加密?
系统部署在实体机?虚拟机?容器中?系统占用多少进程、多少线程、最大线程数多少?占用内存、磁盘、带宽多少?是计算型应用、还是存储型?占用了哪些端口?外部依赖有哪些?哪些是核心依赖、哪些是非核心依赖?数据库容量多少、每天增量多少、数据库读写QPS是多少?缓存多少?数据库、缓存的部署架构是什么:主从?高可用怎么保证?日常流量分布、高峰低谷是什么时候?压测上限、单机承载上限是多少?节假日是否需要扩容?
系统需求量多少?季度规划?半年规划?目前有多少资源(前后端、PM、QA等资源)、各人员能力水平如何、能做多少事情?未来对系统的期望、做到什么程度?
暂时想到哪就写到,没有很好总结;