文章分类 - 极客时间
摘要:你好,我是陈皓,网名左耳朵耗子。 熔断机制这个词对你来说肯定不陌生,它的灵感来源于我们电闸上的“保险丝”,当电压有问题时(比如短路),自动跳闸,此时电路就会断开,我们的电器就会受到保护。不然,会导致电器被烧坏,如果人没在家或是人在熟睡中,还会导致火灾。所以,在电路世界通常都会有这样的自我保护装置。
阅读全文
摘要:你好,我是陈皓,网名左耳朵耗子。 关于重试,这个模式应该是一个很普遍的设计模式了。当我们把单体应用服务化,尤其是微服务化,本来在一个进程内的函数调用就成了远程调用,这样就会涉及到网络上的问题。 网络上有很多的各式各样的组件,如DNS服务、网卡、交换机、路由器、负载均衡等设备,这些设备都不一定是稳定的
阅读全文
摘要:你好,我是陈皓,网名左耳朵耗子。 前面,我们说过,分布式系统有一个比较明显的问题就是,一个业务流程需要组合一组服务。这样的事情在微服务下就更为明显了,因为这需要业务上一致性的保证。也就是说,如果一个步骤失败了,那么要么回滚到以前的服务调用,要么不断重试保证所有的步骤都成功。 这里,如果需要强一致性,
阅读全文
摘要:你好,我是陈皓,网名左耳朵耗子。 之前在我们讲的幂等设计中,为了过滤掉已经处理过的请求,其中需要保存处理过的状态,为了把服务做成无状态的,我们引入了第三方的存储。而这一篇中,我们来聊聊服务的状态这个话题。我认为,只有清楚地了解了状态这个事,我们才有可能设计出更好或是更有弹力的系统架构。 所谓“状态”
阅读全文
摘要:你好,我是陈皓,网名左耳朵耗子。 所谓幂等性设计,就是说,一次和多次请求某一个资源应该具有同样的副作用。用数学的语言来表达就是:f(x) = f(f(x))。 比如,求绝对值的函数,abs(x) = abs(abs(x))。 为什么我们需要这样的操作?说白了,就是在我们把系统解耦隔离后,服务间的调用
阅读全文
摘要:你好,我是陈皓,网名左耳朵耗子。 前面所说的隔离设计通常都需要对系统做解耦设计,而把一个单体系统解耦,不单单是把业务功能拆分出来,正如前面所说,拆分完后还会面对很多的问题。其中一个重要的问题就是这些系统间的通讯。 通讯一般来说分同步和异步两种。同步通讯就像打电话,需要实时响应,而异步通讯就像发邮件,
阅读全文
摘要:你好,我是陈皓,网名左耳朵耗子。 隔离设计对应的单词是Bulkheads,中文翻译为隔板。但其实,这个术语是用在造船上的,也就是船舱里防漏水的隔板。一般的船无论大小都会有这个东西,大一点的船都会把船舱隔成若干个空间。这样,如果船舱漏水,只会进到一个小空间里,不会让整个船舱都进水而导致整艘船都沉了,如
阅读全文
摘要:你好,我是陈皓,网名左耳朵耗子。 我前面写的《分布式系统架构的本质》系列文章,从分布式系统的业务层、中间件层、数据库层等各个层面介绍了高并发架构、异地多活架构、容器化架构、微服务架构、高可用架构、弹性化架构等,也就是所谓的“纲”。通过这个“纲”,你能够按图索骥,掌握分布式系统中每个部件的用途与总体架
阅读全文
摘要:你好,我是陈皓,网名左耳朵耗子。 这个世界到今天已经有很多很多的编程范式,相当复杂。下面这个图比较好地描绘了这些各式各样的编程范式,这个图越往左边就越是“声明式的”,越往右边就越不是“声明式的”(指令式的),我们可以看到,函数式编程和逻辑编程,都在左边,而右边是指令式的,有状态的,有类型的。 上面这
阅读全文
摘要:你好,我是陈皓,网名左耳朵耗子。 这节课重点介绍Prolog语言。Prolog(Programming in Logic)是一种逻辑编程语言,它创建在逻辑学的理论基础之上,最初被运用于自然语言等研究领域。现在它已被广泛地应用在人工智能的研究中,可以用来建造专家系统、自然语言理解、智能知识库等。 Pr
阅读全文
摘要:你好,我是陈皓,网名左耳朵耗子。 前面我们讲了各式各样的不同语言的编程范式,从C语言的泛型,讲到C++的泛型,再讲到函数式的 Map/Reduce/Filter,以及 Pipeline 和 Decorator,还有面向对象的多态通过依赖接口而不是实现的桥接模式、策略模式和代理模式,以及面向对象的Io
阅读全文
摘要:你好,我是陈皓,网名左耳朵耗子。 我们再来看Go语言这个模式,Go语言的这个模式挺好玩儿的。声明一个struct,跟C很一样,然后直接把这个struct类型放到另一个struct里。 委托的简单示例 我们来看几个示例: type Widget struct { X, Y int } type Lab
阅读全文
摘要:你好,我是陈皓,网名左耳朵耗子。 基于原型(Prototype)的编程其实也是面向对象编程的一种方式。没有class化的,直接使用对象。又叫,基于实例的编程。其主流的语言就是JavaScript,与传统的面向对象编程的比较如下: 在基于类的编程当中,对象总共有两种类型。类定义了对象的基本布局和函数特
阅读全文
摘要:你好,我是陈皓,网名左耳朵耗子。 前面我们谈了函数式编程,函数式编程总结起来就是把一些功能或逻辑代码通过函数拼装方式来组织的玩法。这其中涉及最多的是函数,也就是编程中的代码逻辑。但我们知道,代码中还是需要处理数据的,这些就是所谓的“状态”,函数式编程需要我们写出无状态的代码。 而这天下并不存在没有状
阅读全文
摘要:你好,我是陈皓,网名左耳朵耗子。 在上一讲中,我们领略了函数式编程的趣味和魅力,主要讲了函数式编程的主要技术。还记得有哪些吗?递归、Map、Reduce、Filter等,并利用Python的Decorator和Generator功能,将多个函数组合成了管道。 此时,你心中可能会有个疑问,这个deco
阅读全文
摘要:你好,我是陈皓,网名左耳朵耗子。 从前三章内容中,我们了解到,虽然C语言简单灵活,能够让程序员在高级语言特性之上轻松进行底层上的微观控制,被誉为“高级语言中的汇编语言”,但其基于过程和底层的设计初衷又成了它的短板。 在程序世界中,编程工作更多的是解决业务上的问题,而不是计算机的问题,我们需要更为贴近
阅读全文
摘要:你好,我是陈皓,网名左耳朵耗子。 前面,我们讨论了从C到C++的泛型编程方法,并且初探了更为抽象的函数式编程。正如在上一讲中所说的,泛型编程的方式并不只有C++这一种类型,我们只是通过这个过程了解一下,底层静态类型语言的泛型编程原理。这样能够方便我们继续后面的历程。 是的,除了C++那样的泛型,如果
阅读全文
摘要:你好,我是陈皓,网名左耳朵耗子。 在上节课,我从C语言开始说起,聊了聊面向过程式的编程范式,相信从代码的角度你对这类型的语言已经有了一些理解。作为一门高级语言,C语言绝对是编程语言历史发展中的一个重要里程碑,但随着认知的升级,面向过程的C语言已经无法满足更高层次的编程的需要。于是,C++出现了。 C
阅读全文
摘要:序 你好,我是陈皓,网名左耳朵耗子。 现在很多的文章和演讲都在谈架构,很少有人再会谈及编程范式。然而, 这些基础性和本质性的话题,却是非常非常重要的。 一方面,我发现在一些语言争论上,有很多人对编程语言的认识其实并不深;另一方面,通过编程语言的范式,我们不但可以知道整个编程语言的发展史,而且还能提高
阅读全文
摘要:你好,我是陈皓,网名左耳朵耗子。 我们在之前的系列文章《分布式系统架构的本质》中说过,分布式系统的一个关键技术是“数据调度”。因为我们需要扩充节点,提高系统的高可用性,所以必须冗余数据结点。 建立数据结点的副本看上去容易,但其中最大的难点就是分布式一致性的问题。下面,我会带你看看数据调度世界中的一些
阅读全文