@Lenciel

你一生的故事

《你一生的故事》是 Ted Jiang 大概 20 年前的作品,去年被翻拍成了电影,叫《降临》。

原作偏硬,穿插着麦克塔加特的「B 时间序列」,很容易被误读成「时间最短原理」的「费马原理」,大段大段围绕「沃夫假说」,也就是「语言决定了人类认知世界的方式」来展开的语言学内容。

但小说的感情线并不复杂,维伦纽瓦的改编也就以此为核心发力。

所以很多朋友的评价是 ,氛围营造得很好,音乐也棒,但是完全不烧脑。

其实码农姜就是这一卦的:他的科幻硬归硬,但讨论的都是一些哲学问题。如果没有产生共振,会觉得比较平淡。但一旦被他点燃,恐怕三观都会被烧得干干净净。

《你一生的故事》的细节和内核,都围绕着「自由与宿命」这个问题。

比如破解外星人语言这个细节,安排的是男主角 Ian 用「费马原理」来解释光的折射:当光进入水中,传播速度变慢了,如果光仍然按照原来的直线走下去的话,它到达目的地的时间就会变长,于是光改变了路径。

换句话说,光这么走的原因,是因为它知道自己的「结果」在哪里。

先有结果,才有原因,这和人类线性的语言带来的线性的世界观很不同。

看过费曼在《QED: The Strange Theory of Light and Matter》里面解释电磁波折射的你们,心里面当然觉得呵呵,但文科生 Louise 就开始思索,光的宿命,人的宿命,万事万物的宿命,于是悟出了七肢桶语言的奥义。

至此,Louise 原本线性的世界也就形成了回路,她一次次的看到了自己的未来:自己会阻止战争,Ian 将会和她结合,他们的女儿 Hannah 将会夭折,她会告诉 Ian 女儿的宿命,Ian 会因为承受不了这种打击而离开,她将一个人承受与女儿幸福的相处和注定悲剧的结局。

这里面有很妙的地方,比如 Louise 劝我天朝将军的那一席话,究竟是她告诉了将军于是将军在未来告诉了她,还是未来的将军告诉了她于是她告诉了将军,还是…

更关键的是,你已经知道了自己的命运,并且也知道无法改变它,你是否还有必要再去经历这场命运?

作者温暖而笃定的结尾,是自己的答案:

「Do you want to make a baby?」 And I smile and answer, 「Yes,」 and I unwrap his arms from around me, and we hold hands as we walk inside to make love, to make you.

女主角接受这样的结局,她的世界也不再有单纯的原因和结果,不再有过去、现在和未来的界限:她活的,是自己经历的每时每刻。

和 Hannah 每个拥抱,都交织着快乐和痛苦

那么,做出这样的决定,应该算屈服于宿命了呢,还是应该算尊重了自己的自由意志呢?

这让我想起老子说的,「无为而无不为」。

「无为」是明白在规律面前,无能为力:不要花时间去对抗这种事情。

比如,人都会老,挺悲剧的,那么你非要拉皮,打针,去掉苹果肌?

那人还都会死呢,这更悲剧,你要不要炼丹,修仙,熬煮童男童女?

「无不为」是明白了规律之后,就能无所不为。

因为你知道规律了,就能辨别哪些规矩是真正存在的,哪些是用来管理普通人的。

所以,要获得真正的自由,可能是需要你像 Louise 一样,接受自己宿命的界限。

祝各位今晚玩得开心!

采用事件驱动实施微服务架构

事件

我们在实践微服务架构的时候,根本目的是为了在「商业层面」拥有更加敏捷的系统:更容易响应需求变化,更容易添加、发布和尝试新功能,从而跑在竞争对手前面。

要做到敏捷,系统首先必须是自治的(autonomous)。自治性(autonomy)可以说是敏捷系统的一个先决条件:系统的各个部分相互之间如何沟通,当某个部分失败时如何处理和自动恢复等等,都需要自治性。自治性意味着系统的各个部分可以独立运作,对其他系统,团队和流程的依赖都可以 shed:也就是说,对服务 A 的修改不应该影响到依赖它的服务 B,A 服务挂了,B 服务也应该健在。

自治性的系统是微服务架构造就的吗?并不见得:真正成功实践了微服务架构的公司,真正重要的也不是这个技术而是组织架构上的先行。自治的系统,比如开源社区,城市,自由股票市场,甚至是一个迁徙中的鸟群,它们都不断地适应环境,响应变化,在失败案例中不断地学习。

这类被称为「复杂自适应系统(Complex Adaptive Systems)」的系统,是经过科学家专门研究,得出了很多结论的。其中很重要的一个就是,自治的系统会对「事件」作出「响应」。

当有事件发生时,一个自治的系统,不管是蚁群,人类组织,还是一个软件服务,会选择「做什么」或者「不做什么」,来进行响应。整个复杂的系统,都是这些事件在驱动的。这其实也很好理解,想想我们每天醒来,会根据温度穿衣;开车上班,会根据信号灯启停。我们人类的整个生活都是在对各种事件作出响应。

软件系统也可以被构造成这样:独立,自治,容错,可扩展。

从授权到自治,以及最终一致性

在很多分布式系统的实现里面,人们都通过创建一个单一地址空间来适应不稳定的网络环境。这是个从很多方面来看都错误的做法,但是它实现起来要简单一些:通过 RPC 调用,让 remote 的对象处理一些任务,或者请求一些数据。以电商里面结算购物车为例:购物车服务调用计价服务,计价服务可能会调用物流服务,根据发货地区和物流服务商等因素调整价格,同时购物车服务又会调用仓储服务来获取信息和更新货架。这就是所谓的「授权管理」模式:我们调用对数据有修改权限的服务,完成相应的操作。这种模式就意味着大量的全局状态和互斥锁,并且需要大量的事务。

并且,这种基于授权的设计也会导致瓶颈产生:一个服务挂掉,就容易雪崩;不同服务对数据需求不一样的时候,API 越来越乱,或者产生一个大而全的统一 API,提供给每个服务大量不需要的细节数据。

如果我们换个角度来看系统:不是依靠调用方对某个资源或者服务可以行使的权力来驱动系统,而是通过时间和时间轴上发生的事件来驱动系统,就像我们自己的实际生活一样。还是以电商的系统举例,我们的物流服务有没有可能知道目前顺丰在某个区域搞活动,使用顺丰有优惠,然后把这个数据保存在自己的数据库里面,这样每个订单产生时,这些区域的订单默认使用顺丰?如果我们的服务都这样来设计,它们的研发就不需要考虑太多依赖方当前的状态。

最终一致性?

通过事件驱动,而不是通过「just-in-time」的授权查询使得系统里各个服务能够更加自治,更好容错,更有弹性。但是影响复杂自适应系统的自治性的一个因素,也会影响自治的事件驱动系统,那就是时延「delays」。

如果你发现了某个事件已经发生,你立刻就可以做出反应。比如,有车强行变道进入你的车道,你会马上变道避让或者刹车。但是如果在「知道事件发生」这部分有时延,你的反应就没法那么迅速了,比如你正在训家里小朋友,结果没有发现有车变道进来了,就会「咣」…软件系统也一样。

么最终一致性指什么呢?再以购物为例。如果不是事件驱动的,那么如果你往购物车里面添加了某个商品,这时候仓储服务如果出了问题,你的查询没有返回,你就只好死等在那里。但是如果大家都使用事件驱动,你添加购物车的时候,发出了一个事件。这个时候仓储服务不在线,前端上看来,你还是把商品加入了购物车。当仓储系统恢复时,它收到之前那个事件,发现这个商品已经卖光了,这个时候它抛出一个「库存不足」的事件。购物车服务,计费服务等服务就根据当前用户的状态,去消费这个事件(如果没有结算就在结算的时候通知用户,如果已经结算就要退款或者补货等等)。这样让用户不被阻塞,并最终保持状态一致,就叫做最终一致性。

需要的技术

关于事件,延迟和一致性,再多说几句。事件只有在能够保证它们的时序的时候,才是可用的。也就是说,一组事件的时序,必须对于消费方来说是可信的。这涉及分布式系统里面的另外一个难题,对于构建「transactionality」也同样重要,以后再细说。但总的来说,如果事件乱序了,那么我们不做手工的修复就没有保持最终一致性。Martin Kleppmann管这个叫做「perpetual inconsistency」。时延,乱序,是分布式系统里面的两个难题。

Don't touch me