如果真的要把Go语言加入OpenStack开发,需要考虑哪些问题?

简介:

一直以来OpenStack都只是用Python编写的,别的语言不是没用只是用到的很少,核心部分几乎都是Python,现有人提议让Go语言也用在API服务方面。

OpenStack

在新版本Newton出炉的周期中,技术评估委员会接到了一份把Go语言作为OpenStack官方开发语言的提议。随后进行了许多讨论,这里不过多赘述过程,只是谈谈几点讨论的结果。

决议是暂时拒绝让Go作为官方开发语言,但表示未来可以接着讨论,我觉得Go被拒绝可能有以下几方面的原因:

1.技术委员会成员担心增加新的语言会对社区造成的影响。会不会对社区带来分裂,会不会形成一个孤岛,会不会给新入门的人带来额外的门槛?

2.技术委员会的一些成员认为如今对社区中的一些方面缺乏信息,研究和工作。 Go代码如何在整个社区中共享? 认证怎么做? 消息层怎么弄? 如何产出版本? 如何维持分支的稳定?

3.提议Go语言的团队除了自己的项目以外根本就没做过跨项目的任务,这不由得引起了怀疑,使得许多技术委员会的质疑是否能够顺利完成。

接受一门新的语言需要哪些条件呢?

我先声明,我所说的不代表技术委员会而仅代表我个人意见,从而方便交流,好会让整个社区的人发表意见,无论是同意或者反对我的想法。

讨论期间我最关心的是第一部分,主要是因为我觉得向“Big Tent”的迁移还没完成。我也不知道怎么才会让我觉得这迁移已经完成了,我能肯定的是我们在解决大的变化发生前需要解决的问题。

言归正传,我越来越喜欢给许多东西设定期望,尤其是一些能带来改变的请求。把预期列出来之后,就能让相关的人了解到他们正在向哪一个方向行进,并且找到改变可能会面临的问题。

我对第二个问题远没有第一个问题那么担心。它会对参与讨论这一变化的团队表现出很强的承诺,因为这涉及到未来对社区所有成员使用和参考的基础知识库。我以为第二部分的工作可能有些超纲,但并不是这样。通过研究怎么共享代码,怎么测试代码,怎么输出代码,怎么做认证库等,我们在设定未来实际工作中需要用到的基础的东西。

无论如何,我上面提到的“基础的东西”是什么呢?我将在下面不太详尽的列表中简单谈一下:

为新语言定义分享代码和库的方式

Oslo Team负责维护整个OpenStack社区需要经常用到的库。这些库包括消息库(oslo.messaging),i18n库(oslo.i18n),数据库层库(oslo.db)等关键库。

这些库本身并不能让Oslo组的人忙起来,它们是为了收集以前在社区中存在于许多项目中的重复性的公共代码。这个代码现在由Oslo移除,稳定和发布。

我觉得作为一个社区,这是无可避免的。一旦越来越多的项目使用相同的语言就会出现共享代码的需求。 因此,我觉得我们需要更好地定义一个编程语言的代码怎么在社区共享,这个挺重要的,哪怕是在编程语言被接受之前就很重要。

我觉得提前做一些事情不意味着将来没事可做,我们都知道会有许多为预料到的事情和发生变化的事情,我觉得这些工作能涉及到大部分初始化的工作。

关于OpenStack基本服务的基本库

这可能看起来像一个相当高的目标。虽然想搞清楚代码如何共享是一个很困难的需求,但我认为这离OpenStack服务的最低要求还差很远。

集成在生态系统中的OpenStack服务至少需要以下任意一个库:

·keystoneauth / keystone-client

·oslo.config

·oslo.db

·oslo.messaging

如果在使用数据库或者消息队列抽象库的时候没有任何消耗的话,很可能提供的抽象层是错的,从而导致糟糕的API。从另一个方面说,认证层是几乎所有OpenStack服务都会用到的部分,应该可以很方便使用才对,但这不是说这件事本身很简单。

通过处理这些库中的任何一个,都可以测试CI作业,通过这些作业来确保新项目的基础设置是正确。

定义可交付项如何分布

OpenStack的发布过程几乎完全是自动化的,发布过程中涉及到的所有可交付项都是由社区自动产出并由发布团队来管理的。最后,将每个交付项生成压缩包。

目前使用Python编程语言(以及其他几门编程语言)的时候 ,这些压缩包因为只包含这些源代码所以还很简单。对于像Go这样的编译型语言,我们就得考虑压缩包里要压缩什么了,压缩编译过的二进制代码吗?是不是应该加入源代码呢?如果要包含二进制代码,是不是也应该考虑两种不同的压缩包呢?一个是二进制代码,一个是源代码。

维护稳定分支部分的工作怎么办?

稳定的分支在社区经常被遗忘,维护这些稳定分支的团队得到的感谢比较少。然而稳定分支的代码运行在许多OpenStack云环境下,它们对于向后兼容的后端迁移修复非常关键。

每一门语言都有自己发布库的方式,管理兼容性的方式。当为社区加入新的编程语言,与原有的其他团队之间的合作是至关重要的。

为新的语言设置CI管道

还有就是与基础设施组讨论设置CI管道。

这个任务可能是许多工作的基础。为了解决之前的许多任务,有必要设置CI作业,这涉及与基础架构团队协调。后者是至关重要的。 基础设施团队的参与对于添加任何新语言都至关重要,他们的反馈将在许多决策中发挥重要作用。

回顾一下为Python语言做的一些基础工作,其实是大多数项目都需要做的事情。我希望致力于加入新语言的团队可以做一些通用性的事情,为以后跨多个项目的时候使用。

比如会有以下几方面的通用性工作:

·Lint checkers

·Doc builders

·Release Pipelines

要做的似乎还有很多

把上面提到的方方面面都做到的话的确需要许多人力和时间。不幸的是,涉及到的许多团队真的腾不出手来做别的事情了,所以我觉得大部分工作将会由各组里多语言感兴趣的人来贡献出来的。无论如何,这些工作势必耽误每个团队的工作时间,即使是大部分的研究,文档和补丁都是由有兴趣的团队来自愿完成的。

整个社区花了多年时间让Python处于目前的状态。我不指望一个团队工作一个礼拜来把新的语言代码加入到已经用了六年的Python体系中。然而,机制已经建立,团队也已经存在,在一起协作下,上述的问题可能会在合理的时间点得到解决。

我希望这是个循序渐进的过程,这就是我为什么强调需要经过以上几个步骤的原因。人有流动性,即使是做过承诺有时候也不管用,我认为做这是最重要的是先做,然后在渐渐接受这门语言。

最后,即使存在一个形式良好的添加新语言的过程,我仍然推荐优先使用Python而不是其他语言。这与语言偏好无关,只是与我们社区中现有的知识的传播有关,我相信这种知识是无价的,将这些知识变成一种新的语言需要几年时间,相比之下优化则是一个更容易的任务

创新对很多项目都很重要。我们也相信不可能永远保持原样,语言的变化,项目的兴起,项目的消亡等等。加入新语言这回事儿也是社区变化 的一部分,我也希望OpenStack社区尽可能以最好的方式拥抱变革。但我希望是以一种相对保守的方式。我相信本文中提到的这些任务将会帮助大家未来以更快、更安全的方式来增加新的语言。

当然,以上都是我的个人观点,我现在越来越痴迷于明确预期。因此,我会起草并提交一份正式文档到技术委员会。

本文转自d1net(转载)

目录
相关文章
|
1天前
|
前端开发 Go
Golang深入浅出之-Go语言中的异步编程与Future/Promise模式
【5月更文挑战第3天】Go语言通过goroutines和channels实现异步编程,虽无内置Future/Promise,但可借助其特性模拟。本文探讨了如何使用channel实现Future模式,提供了异步获取URL内容长度的示例,并警示了Channel泄漏、错误处理和并发控制等常见问题。为避免这些问题,建议显式关闭channel、使用context.Context、并发控制机制及有效传播错误。理解并应用这些技巧能提升Go语言异步编程的效率和健壮性。
9 5
Golang深入浅出之-Go语言中的异步编程与Future/Promise模式
|
1天前
|
监控 负载均衡 算法
Golang深入浅出之-Go语言中的协程池设计与实现
【5月更文挑战第3天】本文探讨了Go语言中的协程池设计,用于管理goroutine并优化并发性能。协程池通过限制同时运行的goroutine数量防止资源耗尽,包括任务队列和工作协程两部分。基本实现思路涉及使用channel作为任务队列,固定数量的工作协程处理任务。文章还列举了一个简单的协程池实现示例,并讨论了常见问题如任务队列溢出、协程泄露和任务调度不均,提出了解决方案。通过合理设置缓冲区大小、确保资源释放、优化任务调度以及监控与调试,可以避免这些问题,提升系统性能和稳定性。
11 5
|
1天前
|
安全 Go
Golang深入浅出之-Go语言中的并发安全队列:实现与应用
【5月更文挑战第3天】本文探讨了Go语言中的并发安全队列,它是构建高性能并发系统的基础。文章介绍了两种实现方法:1) 使用`sync.Mutex`保护的简单队列,通过加锁解锁确保数据一致性;2) 使用通道(Channel)实现无锁队列,天生并发安全。同时,文中列举了并发编程中常见的死锁、数据竞争和通道阻塞问题,并给出了避免这些问题的策略,如明确锁边界、使用带缓冲通道、优雅处理关闭以及利用Go标准库。
10 5
|
2天前
|
存储 缓存 安全
Golang深入浅出之-Go语言中的并发安全容器:sync.Map与sync.Pool
Go语言中的`sync.Map`和`sync.Pool`是并发安全的容器。`sync.Map`提供并发安全的键值对存储,适合快速读取和少写入的情况。注意不要直接遍历Map,应使用`Range`方法。`sync.Pool`是对象池,用于缓存可重用对象,减少内存分配。使用时需注意对象生命周期管理和容量控制。在多goroutine环境下,这两个容器能提高性能和稳定性,但需根据场景谨慎使用,避免不当操作导致的问题。
15 4
|
2天前
|
安全 Go 开发者
Golang深入浅出之-Go语言中的CSP模型:深入理解并发哲学
【5月更文挑战第2天】Go语言的并发编程基于CSP模型,强调通过通信共享内存。核心概念是goroutines(轻量级线程)和channels(用于goroutines间安全数据传输)。常见问题包括数据竞争、死锁和goroutine管理。避免策略包括使用同步原语、复用channel和控制并发。示例展示了如何使用channel和`sync.WaitGroup`避免死锁。理解并发原则和正确应用CSP模型是编写高效安全并发程序的关键。
21 4
|
3天前
|
安全 Go 开发者
Golang深入浅出之-Go语言中的CSP模型:深入理解并发哲学
【5月更文挑战第1天】Go语言基于CSP理论,借助goroutines和channels实现独特的并发模型。Goroutine是轻量级线程,通过`go`关键字启动,而channels提供安全的通信机制。文章讨论了数据竞争、死锁和goroutine泄漏等问题及其避免方法,并提供了一个生产者消费者模型的代码示例。理解CSP和妥善处理并发问题对于编写高效、可靠的Go程序至关重要。
13 2
|
3天前
|
设计模式 Go 调度
Golang深入浅出之-Go语言中的并发模式:Pipeline、Worker Pool等
【5月更文挑战第1天】Go语言并发模拟能力强大,Pipeline和Worker Pool是常用设计模式。Pipeline通过多阶段处理实现高效并行,常见问题包括数据竞争和死锁,可借助通道和`select`避免。Worker Pool控制并发数,防止资源消耗,需注意任务分配不均和goroutine泄露,使用缓冲通道和`sync.WaitGroup`解决。理解和实践这些模式是提升Go并发性能的关键。
20 2
|
3天前
|
JSON 监控 安全
Golang深入浅出之-Go语言中的反射(reflect):原理与实战应用
【5月更文挑战第1天】Go语言的反射允许运行时检查和修改结构,主要通过`reflect`包的`Type`和`Value`实现。然而,滥用反射可能导致代码复杂和性能下降。要安全使用,应注意避免过度使用,始终进行类型检查,并尊重封装。反射的应用包括动态接口实现、JSON序列化和元编程。理解反射原理并谨慎使用是关键,应尽量保持代码静态类型。
17 2
|
3天前
|
Go
Golang深入浅出之-Go语言代码质量与规范:遵循Gofmt与Linting
【5月更文挑战第1天】本文讨论了如何使用`gofmt`和Lint工具提升Go代码质量。`gofmt`负责自动格式化代码,保持风格统一,而Lint工具如`golint`、`govet`、`staticcheck`则进行静态分析,检查潜在错误和未使用的变量。通过集成`gofmt`检查到CI/CD流程,避免格式冲突,并使用Lint工具发现并修复问题,如未处理的错误、不规范命名。遵循这些最佳实践,可提高代码可读性、团队协作效率和可维护性。
13 3
|
4天前
|
JSON 安全 Java
2024年的选择:为什么Go可能是理想的后端语言
【4月更文挑战第27天】Go语言在2024年成为后端开发的热门选择,其简洁设计、内置并发原语和强大工具链备受青睐。文章探讨了Go的设计哲学,如静态类型、垃圾回收和CSP并发模型,并介绍了使用Gin和Echo框架构建Web服务。Go的并发通过goroutines和channels实现,静态类型确保代码稳定性和安全性,快速编译速度利于迭代。Go广泛应用在云计算、微服务等领域,拥有丰富的生态系统和活跃社区,适合作为应对未来技术趋势的语言。
10 0