介绍

自从我参与DevOps和大数据以来,我一直在使用两种出色的但完全不同的编程语言:Go和Scala。

Scala是一种较旧且更成熟的编程语言,已在并发编程和大数据处理等领域找到了自己的定位。 另一方面,Go是Google为克服C ++的批评而创建的一种更新,更简单的语言。 设计考虑多核处理器的语言。

两者都是出色的语言,可以为并发应用程序和流处理实现出色的性能,但是它们的设计却大不相同。在本文中,我将尝试为您简要介绍这两种语言,它们的优缺点,并回顾一些实际的用词情况,在这些情况下,我们将推荐一种语言而不是另一种语言。

简而言之Scala

Scala是一种由学者创建的编程语言,它是在JVM上运行的Java的第一种替代方法。 它定义为:

Scala是一种现代的多范式编程语言,旨在以简洁,优雅且类型安全的方式表达常见的编程模式。[1]

Scala既面向功能又面向对象,提供了两全其美的优势。 它具有定义程序的灵活方式,并且由您决定如何描述它们:从纯函数式编程到纯面向对象的编程。

像Java一样,Scala是面向对象的:

从每个值都是对象的意义上讲,Scala是一种纯面向对象的语言。对象的类型和行为通过类和特征来描述。[1]

它还为功能编程和强大的静态类型系统提供支持。 与Java不同,Scala具有功能编程语言的许多功能,例如Scheme,Standard ML和Haskell,包括currying,类型推断,不变性,惰性评估和模式匹配。 它还具有一个高级类型系统,该系统支持代数数据类型,协方差和对数,高阶类型(但不包括高阶类型)和匿名类型。

从每个功能都是一个值的意义上讲,Scala也是一种功能语言。 Scala提供了用于定义匿名函数的轻量级语法,它支持高阶函数,它允许嵌套函数,并支持currying。[1]

大数据开发语言怎么选?Scala 还是 Go 

Java中不存在的Scala的其他功能包括运算符重载,可选参数,命名参数和原始字符串。 相反,Scala中没有的Java功能就是检查异常,事实证明这是有争议的。

在其他用例中,Scala在大数据中被大量使用。 诸如Twitter之类的公司转移到Scala,特别是因为更好的并发支持。 Scala功能强大,但很难学习,并且仍然存在与Java的兼容性问题。

Scala使用的两个关键驱动因素是基于用于并行编程的actor系统的Akka框架和用于大数据的Spark处理引擎。 由于其学术性质,与Akka或Spark以外的其他语言相比,Scala在实际单词中没有发现太多用法。 尽管它在金融机构中大量使用。

Scala 的优点

  • 在JVM上运行。 它具有多年来构建的所有JVM优化功能,并且与Java兼容。

  • 非常简洁,与Java或GO相比,它需要更少的样板代码。

  • 函数式编程和面向对象。

  • 类型系统非常强大。 您可以为您的库构建自定义DSL,在编译时执行检查等等。

  • 函数式编程的所有优点。

  • 基于参与者Actor模型的Akka生态系统使其成为并发系统的绝佳选择。

  • 强大的构建工具。

  • 多才多艺。 Scala可用于表达任何类型的问题。

Scala 的缺点

  • 复杂。难以学习和掌握。通常由高级程序员使用。

  • 太广泛了,表达同一件事的方法有一百种,每个Scala开发人员都有自己的风格,并且在大型项目中很难保持代码一致性。

  • Java的一些兼容性问题;同样,如果您需要使用Java库,那么它将剥夺Scala的优势。

  • 编译速度慢。尽管有诸如Bloop之类的工具可以缓解问题。

  • 它继承了云原生应用程序的JVM问题,例如大型容器,缓慢的警告时间,难以调整,部署缓慢等。

  • 尽管用途广泛,但Scala只是发现了某些场景,因此并未被广泛采用。

用例

  • 大数据和分析。由于其强大的类型系统和可扩展性,大数据领域中的许多工具(例如Spark)都使用Scala。它是数据工程师以及大型流和批处理引擎的首选语言。

  • 并发系统和实时应用程序。 Akka框架以并发系统的可伸缩性而闻名,并广泛用于使用JVM的交易服务和其他高度并发的系统。

  • 高度并发的API。Play框架提供了一个高度并发的Web框架,以构建由Akka支持的应用程序和API。

  • 巨石架构。 对于大型整体应用程序(甚至是分布式应用程序),Scala是绝佳的选择。 使用Akka群集,您可以在单个应用程序内创建高度分散的应用程序。

  • 通常,Scala用于为特定领域(例如Akka或Spark)构建框架和库。

简而言之

Go是另一种野兽。与Scala相比,它不那么优雅,功能强大或简洁,但它是为特定目的而构建的,并且做得非常好。

Go由Google创建,并且在语法上与C类似。它的目标是通过添加内存安全性,垃圾回收,结构化类型来克服C ++中存在的不安全操作。它非常容易学习和使用。它是为多核计算机而构建的,以最大程度地提高并发程序的并行性。它使用称为Go Routines的非常轻量级的绿色线程进行并发编程。

Go可以快速编译为机器代码,但具有垃圾回收的便利性和运行时反射的功能。这是一种快速的,静态类型的编译语言,感觉就像是一种动态类型的解释语言。[2]

Go很小,但是它涵盖了许多用例,例如微服务,流处理,CLI等。 Golang为在不同平台上生成二进制文件提供了出色的支持,而无需在目标上安装Go。 由于二进制文件小而有效,因此非常适合使用Containers打包的云本机应用程序。 您的应用程序容器可以打包到一个很小的容器(〜5–10MB)中,只需几秒钟即可部署,这使其成为比JVM语言更好的微服务选择。 有关更多信息,请查看我有关在Kubernetes中部署Go Microservices的文章。

大数据开发语言怎么选?Scala 还是 Go 

Go 的优点

  • 超快速的编译器,感觉就像是一种解释语言。很棒的开发人员经验。快速的开发过程和提高的生产率。

  • 简单安全,我对Go的钟爱是通常只有一种表达问题的方式,这可以加快开发,代码审查以及整个开发过程的速度。

  • 非常适合初级和高级开发人员。 由于它不需要虚拟环境,因此非常容易学习和采用。

  • 云原生应用程序和Kubernetes的完美选择。由于体积小,没有预热时间和速度。

  • 借助Go Routines,并发变得容易。

  • 伟大的标准库,其中包括Web服务器。

  • Go可以用于各种场景:CLI,Web应用程序,流处理等。

  • 资源使用率极低。您可以在一台服务器上运行数百万个Go例程。与JVM相比,它使用的RAM和CPU很少,因此运行起来便宜得多。

Go 的缺点

  • 它不够简洁,很难保持代码干燥。

  • 太简单的基本事物(如泛型)在Go中不可用,尽管很快就会支持。

  • 这是一种相对较新的语言,没有太多的库或教程。

  • 依赖管理有点反常,很难管理,但是自从添加go mod以来,它已经得到了改进。 好消息是,go mod是语言的一部分,而不是像sbt这样的单独项目,尽管sbtis功能更强大。

  • 错误处理很麻烦。

  • 与Scala相比,它不够优雅,强大和灵活。

  • 与Scala相比,Go有点不成熟。

用例

  • CLI和脚本:像kubectl这样的大多数CLI使用Go。

  • Web应用程序。由于它是高度并发的,并且不需要太多资源,因此非常适合处理HTTP请求。

  • 流应用程序。 Go可以使用Go例程快速处理数百万个事件。 它是Scala中Akka流的竞争对手。

  • 微服务。 由于体积小,速度快且具有监视功能,Go是云原生微服务的理想选择。

  • 无服务器和云应用程序。Go是无服务器功能的理想选择,尤其是在Google Cloud中。

Scala vs Go

Scala 编程语言是强类型,具有垃圾回收器,它们安全,高度并发,并且每秒可以处理数百万条记录。

对于流处理,Go更易于使用,但依赖于发布/订阅系统(例如Kafka)和NoSQL数据库(例如Cassandra)。 Akka本身就是一头野兽,可以自己管理大量请求而没有任何依赖关系,它还提供了更多这样的背压。

对于Web应用程序,Play框架更适合有状态的Web应用程序或寿命长的应用程序,在这些应用程序中,JVM有足够的时间来优化应用程序。 Scala非常适合迷你服务或整体应用。 如果您需要与Akka集成,这也是一个不错的选择。 另一方面,GO更适合微服务,云本机应用程序和无服务器功能。 对于云中的无状态API,我会使用GO,因为它更便宜,更容易。

Go提供了强大的支持gRPC为内部微服务提供了绝佳的选择,这些微服务可以以流的方式快速使用。

对于大数据,Scala或Python是最佳选择。 GO在大数据世界中仍处于起步阶段。

通常,Go的运行和租赁成本较低。 因此,如果成本是一个问题,请研究GO。 另一方面,Scala开发人员往往是非常好的工程师,这也为组织带来了价值。

随着应用程序的增长,GO源代码将变得越来越难以维护,因此我不建议将其作为整体使用,对于更稳定,规模更大的项目,Scala是更好的选择,尤其是对于更传统的企业。

性能

这是一个棘手的问题,如果您在Google vs GO的性能方面会找到几篇文章,并且根据测试结果会有所不同。 刚开始,GO似乎在简单的用例上表现更好,但在实际情况下,Scala以及特别是Play Framework确实赶上了JIT JVM优化,该优化在运行时会调整字节码添加优化。

对于微服务,无状态应用程序和容器化应用程序,GO将更快,更轻量,这是一个巨大的优势。 通常,如果成本对您来说很重要,那么GO将占上风。 对于复杂的应用程序,整体式状态处理,Scala是更好的选择。

大数据开发语言怎么选?Scala 还是 Go 

> GO vs Play REST Get Performance, source: https://medium.com/ymedialabs-innovation/rest-api-performance-comparison-between-golang-and-play-991a8f4040de

对于流处理,这是相同的故事。 Akka功能强大且优雅,具有庞大的生态系统并具有更多功能,但使用,开发和优化都很复杂。 如果您有一支由Akka开发人员组成的优秀团队,他们可以编写一个单例文件,比GO更快地处理事件。 但是,GO扩展非常简单。

推荐建议

如果您是开发人员…

  • 如果您是初级开发人员和/或没有Java经验但具有Python或C ++经验,请学习GO。

  • 如果您想在云上,启动和出色的项目中工作,请学习GO。

  • 如果您花不起数年的时间来学习一门新语言,请学习GO。

  • 如果您是开发流应用程序和API的后端工程师,请学习GO。

  • 如果您拥护DevOps文化,请学习GO。

  • 如果您使用的是Google Cloud,请学习GO。

  • 使用GO编写脚本和命令行工具,POC或超快速API。

  • 如果您是高级开发人员和/或Java开发人员,请学习Scala。

  • 如果您已经使用JVM和/或在本地运行,请学习Scala。

  • 如果您要使用Akka和Spark照顾高薪工作,请学习Scala。

  • 如果您在大数据上投入大量资金,请学习Scala。

  • 如果您想在更传统的行业(例如金融机构)工作,请学习Scala。

简而言之,GO既有趣又酷,易于学习且简单。在3个月内,您可以编写可用于实际用途的生产就绪应用程序。Scala既有趣,复杂又具有挑战性,但回报颇丰,它的薪酬很高,而且声望更高,特别是在大数据世界中。

如果您是技术主管…

  • 当您没有JVM依赖性并且可以在容器内运行二进制应用程序时,请使用GO。

  • 将GO用于无服务器功能而不是JVM。

  • 将GO用于在云或Kubernetes中管理的短期分布式Web应用程序或API。

  • 将GO用于自定义脚本,小型作业和CLI。

  • 使用GO以很少的资源以低成本消耗和处理大量事件。

  • 如果您在云(特别是Google Cloud)中运行,请使用GO。

  • 如果您依赖JVM或您的开发团队已经熟悉Java,请使用Scala。

  • 将Scala用于利用JVM优化的高并发分布式系统。

  • 将Scala用于大数据,尤其是Spark。

  • 如果您的Java应用程序存在扩展问题,请使用Scala。

总而言之,GO是一种消耗很少且易于采用的二进制语言,对于您的工具带来说它是一个不错的工具,但是我不会将它用作大型组织的唯一编程语言,因为它不那么通用和其他语言一样。Scala更加困难,但是如果您已经在使用Java,那么这是一个很好的下一步。

如果您是经理…

  • 使用GO作为节省成本的机制。Go比Scala便宜,不仅Gogo使用更少的资源,而且开发人员的薪水更低。

  • 将GO用于无服务器或Kubernetes。

  • 使用GO吸引年轻的人才,并将公司介绍为一家初创公司。

  • 由于您的大多数GCP服务都基于GO API,因此如果您在Google Cloud中运行,请使用GO。

  • 将Scala用于关键的并发应用程序,整体或实时系统。

  • 使用Scala吸引高技能的高级开发人员。

  • 将Scala用于大数据。

  • 如果您已经在使用Java,并且难以在组织中进行更改且需要花费时间,请使用Scala。

  • 如果您想添加一种新的语言并且不能花费太多时间,GO的使用比Scala容易得多,特别是如果您已经使用C ++而不是Java。

总而言之,GO的运行和雇用人才便宜。 它易于使用,可以在广泛的用例中采用。 当您仍然是核心应用程序的另一种语言时,它也可以用作补充语言。 Scala非常适合大型项目和大数据。 如果您在JVM上投入了大量资金,则Scala是常见的下一步。

结论

在过去的几年中,我一直在使用Go和Scala,两者都有其优点和缺点。作为开发人员,我喜欢在Scala中解决问题,它非常优雅,简洁,强大。和使用的喜悦;但是在现实世界中,我倾向于更频繁地使用GO,因为我可以更快,更便宜地完成工作。当您在需要赚钱的公司工作时,这就是这种方式。由于快速的编译时间和部署时间以及极低的资源使用率,GO是用于云原生应用程序的最具成本效益的语言。尽管如此,对于大数据和高度并发的关键系统来说,Scala是最佳选择,它也比GO更成熟。对于更大,更传统的企业,Scala往往更适合。