关键点
经济学人内容分发系统需要更大的灵活性,将内容传递给日益多样化的数字渠道。为了实现这一灵活性目标并保持高水平的性能和可靠性,平台从一个单体结构过渡到微服务体系结构。
用Go编写的服务是新系统的一个关键组件,它使得团队能够交付可伸缩的、高性能的服务并快速迭代新产品。
Go的并发性和对API的支持以及它作为静态编译语言的设计,使得分布式事件系统能够大规模执行。与此同时,Go对于测试的支持也非常出色。
总的来说,团队在Go上的使用经验是积极的,这也是内容平台得以扩展的关键因素之一。
随着新闻消费从纸媒转向数字媒体,《经济学人》的使命是让更广泛的数字受众看到这种技术转变。因此需要更大的灵活性,将内容传递给日益多样化的数字渠道。为了实现这一灵活性目标并保持高水平的性能和可靠性,平台从一个单体结构走向微服务体系结构。用Go编写的服务是新系统的一个关键组件,它将使团队能够交付可伸缩的、高性能的服务并快速迭代新产品。
以下是基于Go的一些实践与问题:
允许工程师快速迭代产品并开发新特性
强化智能错误处理并针对服务快速失败的实践
为分布式系统中的高并发和网络提供有力支持
在内容和媒体所需的领域缺乏成熟度和支持
通过平台实现规模化的数字内容出版发行
为什么使用Go?
为了回答这个问题,先看看新平台的总体架构是很有帮助的。这个平台称为内容平台,是一个基于事件的系统。它响应来自不同内容创作平台的事件,并触发独立的微服务处理这些流程。这些服务的功能包括数据标准化、语义标签分析、ES索引,以及将内容推送到苹果新闻或Facebook等外部平台。该平台还有一个RESTful API,它与GraphQL相结合,是前端客户端和产品的主要入口。
在设计总体架构时,团队研究了哪些语言适合平台的需求。将Go与Python、Ruby、Node、PHP和Java进行比较。虽然每种语言都有其优点,但好与平台的体系结构保持一致。Go的并发性和API支持以及它作为静态编译语言的设计将使分布式事件系统能够大规模执行。此外,Go相对简单的语法使学习和开始编写工作代码变得很容易,这对于一个经历了如此多技术转换的团队来说是一个好消息。总的来说,Go被认为是分布式云系统中可用性和效率的佳设计语言。
Go的目标
平台设计的几个元素与Go语言很好地结合在一起。快速失败是系统的关键部分,因为系统本身是由分布式的、独立的服务组成的。按照应用程序的12个因素原则,应用程序需要快速启动和失败。Go作为一种静态编译语言的先天在快速启动上有优势,并且随着编译器的性能不断提高,对于工程或部署来说从来都不是问题。此外,Go的错误处理从设计上不仅允许应用程序快速失败,还允许应用程序更智能地失败。
错误处理
Go与其他语言相比有一个明显的区别,它没有异常,而是用一个错误类型代替。在Go中,所有错误都是值。错误类型是预先声明的,是一个接口。Go中的接口本质上是一个命名的方法集合,如果它具有相同的方法,那么任何其他自定义类型都可以满足该接口。错误类型是一个可以用字符串描述自身的接口。
typeerror interface {
Error() string
}
Go为工程师提供了更好的控制错误处理功能。通过在定制模块中添加返回字符串的Error方法,可以创建定制错误,如下面的函数所示,该函数来自errors包。
typeerrorString struct {
s string
}
func(e *errorString) Error() string {
return e.s
}