当前位置: 首页 > 科技观察

如何选择大数据开发语言?ScalaorGo

时间:2023-03-18 16:09:47 科技观察

简介自从我参与DevOps和大数据以来,我一直在使用两种很棒但完全不同的编程语言:Go和Scala。Scala是一种更古老、更成熟的编程语言,它在并发编程和大数据处理等领域找到了自己的位置。另一方面,Go是谷歌为克服对C++的批评而创建的一种更新、更简单的语言。为多核处理器设计的语言。两者都是伟大的语言,可以为并发应用程序和流处理实现出色的性能,但它们的设计却大不相同。在本文中,我将尝试向您简要介绍这两种语言及其优缺点,并回顾一些我们会推荐一种语言而不是另一种语言的实际单词使用情况。Scala简称Scala是一种由学术界创建的编程语言,作为运行在JVM上的Java的第一个替代方案。它的定义是:Scala是一种现代的多范式编程语言,旨在以简洁、优雅和类型安全的方式表达常见的编程模式。[1]Scala既是函数式的又是面向对象的,提供了两全其美的优势。它有一种灵活的定义程序的方式,如何描述它们由你决定:从纯函数式编程到纯面向对象编程。与Java一样,Scala也是面向对象的:Scala是一种纯粹的面向对象语言,因为每个值都是一个对象。对象的类型和行为由类和特征描述。[1]它还提供对函数式编程和强大的静态类型系统的支持。与Java不同,Scala具有Scheme、StandardML和Haskell等函数式编程语言的许多特性,包括柯里化、类型推断、不变性、惰性求值和模式匹配。它还具有支持代数数据类型、协方差和对数、高阶类型(但不包括高阶类型)和匿名类型的高级类型系统。Scala也是一种函数式语言,因为每个函数都是一个值。Scala提供了用于定义匿名函数的轻量级语法,它支持高阶函数,它允许嵌套函数,并支持柯里化。[1]Java中不存在的Scala的其他特性包括运算符重载、可选参数、命名参数和原始字符串。相反,Scala中没有的Java特性是检查异常,这已被证明是有争议的。在其他用例中,Scala被大量用于大数据。Twitter等公司转向Scala,尤其是因为更好的并发支持。Scala很强大,但很难学,并且与Java仍然存在兼容性问题。Scala使用的两个关键驱动因素是基于用于并行编程的参与者系统的Akka框架和用于大数据的Spark处理引擎。由于其学术性质,与Akka或Spark以外的其他语言相比,Scala在实际词汇中并没有发现太多的用法。虽然它在金融机构中被大量使用。Scala在JVM上运行的优势。它具有多年来构建的所有JVM优化,并且与Java兼容。非常简洁,它比Java或Go需要更少的样板代码。函数式编程和面向对象。类型系统非常强大。您可以为您的库构建自定义DSL,在编译时执行检查,等等。函数式编程的所有好处。Akka的生态系统基于Actor的Actor模型,使其成为并发系统的绝佳选择。强大的构建工具。多才多艺的。Scala可以用来表达任何类型的问题。Scala复杂性的缺点。难以学习和掌握。通常由高级程序员使用。太宽泛了,同一件事有一百种表达方式,每个Scala开发者都有自己的风格,在大型项目中很难保持代码的一致性。与Java的一些兼容性问题;此外,如果您需要使用Java库,那么它会带走Scala的优势。编译很慢。虽然有像Bloop这样的工具可以缓解这个问题。它继承了云原生应用的JVM问题,如容器大、警告时间慢、难以调优、部署慢等。尽管Scala具有通用性,但它只找到了特定的场景,因此没有被广泛采用。用例大数据和分析。大数据空间中的许多工具(例如Spark)都使用Scala,因为它具有强大的类型系统和可扩展性。它是数据工程师和大型流和批处理引擎的首选语言。并发系统和实时应用程序。Akka框架以并发系统的可伸缩性而著称,广泛用于事务服务和其他使用JVM的高度并发系统。高并发API。Play框架提供了一个高度并发的Web框架来构建Akka驱动的应用程序和API。巨石建筑。对于大型单体应用程序(甚至是分布式应用程序),Scala是一个极好的选择。使用AkkaCluster,您可以在单个应用程序中创建高度分布式的应用程序。通常,Scala用于为Akka或Spark等特定领域构建框架和库。简而言之,Go是另一种野兽。它不像Scala那样优雅、强大或简洁,但它是专门构建的,并且做得很好。Go由Google创建,在语法上类似于C。它的目标是通过添加内存安全、垃圾收集和结构化类型来克服C++中存在的不安全操作。它非常容易学习和使用。它是为多核计算机构建的,以最大限度地提高并发程序的并行性。它使用称为GoRoutines的非常轻量级的绿色线程进行并发编程。Go可以快速编译为机器代码,但具有垃圾收集的便利性和运行时反射的强大功能。它是一种快速、静态类型的编译语言,感觉就像一种动态类型的解释语言。[2]Go很小,但涵盖了微服务、流处理、CLI等许多用例。Golang为在不同平台上生成二进制文件提供了出色的支持,而无需在目标上安装Go。由于二进制文件小巧高效,因此非常适合与容器打包的云原生应用程序。您的应用程序容器可以打包到一个微型容器(~5-10MB)中并在几秒钟内部署,这使其成为比JVM语言更好的微服务选择。有关更多信息,请查看我关于在Kubernetes中部署Go微服务的文章。Go的优点超级快速的编译器,感觉像是一种解释型语言。很棒的开发者体验。快速的开发过程和提高的生产力。简单安全,我喜欢Go的地方在于通常只有一种方式来表达问题,这可以加快开发、代码审查和整个开发过程。初级和高级开发人员的理想选择。由于它不需要虚拟环境,因此非常容易学习和采用。非常适合云原生应用程序和Kubernetes。由于体积小,没有预热时间和速度。GoRoutines让并发变得容易。很棒的标准库,包括一个网络服务器。Go可用于各种场景:CLI、Web应用程序、流处理等。资源占用极低。您可以在单个服务器上运行数百万个Go例程。与JVM相比,它使用的RAM和CPU非常少,因此运行成本更低。Go的缺点不够简洁,很难保持代码干爽。像泛型这样过于简单的基本东西在Go中是不可用的,尽管支持很快就会到来。这是一种相对较新的语言,没有很多库或教程。依赖管理有点反常,很难管理,但是自从加入了gomod后,它得到了改进。好消息是gomod是语言的一部分,而不是像sbt一样是一个单独的项目,尽管sbtis更强大。错误处理很麻烦。它不如Scala优雅、强大和灵活。与Scala相比,Go有点不成熟。用例CLI和脚本:大多数CLI(如kubectl)都使用Go。网络应用程序。由于它是高并发的并且不需要太多资源,因此非常适合处理HTTP请求。流应用程序。Go可以使用Go例程快速处理数百万个事件。它是Scala中AkkaStreams的竞争对手。微服务。由于体积小、速度快和监控能力强,Go非常适合云原生微服务。无服务器和云应用程序。Go是无服务器功能的理想选择,尤其是在GoogleCloud中。ScalavsGoScala编程语言是强类型的,有垃圾收集器,它们安全,高并发,每秒可以处理数百万条记录。对于流处理,Go更容易使用,但依赖于发布/订阅系统(如Kafka)和NoSQL数据库(如Cassandra)。Akka本身就是一个野兽,可以在没有任何依赖的情况下自行管理大量请求,并且它提供了更多这样的背压。对于Web应用程序,Play框架更适合有状态的Web应用程序或JVM有足够时间优化应用程序的长期应用程序。Scala非常适合迷你服务或单体应用程序。如果你需要与Akka集成,它也是一个不错的选择。另一方面,GO更适合微服务、云原生应用程序和无服务器功能。对于云中的无状态API,我会使用GO,因为它更便宜、更容易。Go对gRPC的强大支持使其成为可以以流方式快速使用的内部微服务的绝佳选择。对于大数据,Scala或Python是最好的选择。GO在大数据领域仍处于起步阶段。总的来说,Go的运行和租赁成本较低。因此,如果成本是一个问题,请查看GO。另一方面,Scala开发人员往往是非常优秀的工程师,这也为组织带来了价值。随着应用的增长,GO源码会越来越难维护,所以整体不推荐。对于更稳定和更大的项目,Scala是更好的选择,尤其是对于更大的项目。传统业务。性能这是一个棘手的问题,如果你查看GooglevsGO的性能,你会发现几篇文章,它会根据测试结果而有所不同。起初,GO似乎对于简单的用例表现更好,但实际上,Scala,尤其是PlayFramework确实赶上了JITJVM优化,在运行时调整字节码添加优化。对于微服务、无状态应用、容器化应用,GO会更快、更轻,这是一个巨大的优势。一般来说,如果成本对你很重要,GO会占上风。对于复杂的应用程序,单体状态处理,Scala是更好的选择。>GOvsPlayRESTGetPerformance,来源: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。如果您使用的是GoogleCloud,请学习GO。使用GO编写脚本和命令行工具、POC或超快速API。如果您是高级开发人员和/或Java开发人员,请学习Scala。如果您已经使用JVM和/或在本地运行,请学习Scala。如果您打算使用Akka和Spark从事高薪工作,请学习Scala。如果你在大数据上投入大量资金,请学习Scala。如果您想在金融机构等更传统的行业工作,请学习Scala。简而言之,围棋好玩又酷,简单易学。在3个月内,您可以编写可用于实际目的的生产就绪应用程序。Scala有趣、复杂且具有挑战性,但回报丰厚,报酬丰厚,声望更高,尤其是在大数据领域。如果您是技术主管……当您没有JVM依赖项并且可以在容器内运行二进制应用程序时,请使用GO。将GO用于无服务器函数而不是JVM。将GO用于在云或Kubernetes中管理的短期分布式Web应用程序或API。将GO用于自定义脚本、小型作业和CLI。使用GO以很少的资源以低成本消费和处理大量事件。如果您在云中运行(特别是GoogleCloud),请使用GO。如果您依赖JVM或者您的开发团队已经熟悉Java,请使用Scala。将Scala用于利用JVM优化的高度并发分布式系统。将Scala用于大数据,尤其是Spark。如果您的Java应用程序存在缩放问题,请使用Scala。总而言之,GO是一种二进制语言,消耗很少且易于采用,它是您工具带的一个很好的补充,但我不会将它用作大型组织的唯一编程语言,因为它不是那么通用与其他语言。Scala更难,但如果您已经在使用Java,那么它是下一步的好选择。如果您是经理……使用GO作为一种成本节约机制。Go比Scala更便宜,不仅Gogo使用的资源更少,而且开发人员得到的报酬也更少。将GO用于无服务器或Kubernetes。使用GO吸引年轻人才,并将公司介绍为初创公司。由于您的大部分GCP服务都基于GOAPI,因此如果您在GoogleCloud中运行,请使用GO。将Scala用于关键的并发应用程序、单体或实时系统。使用Scala吸引高技能的高级开发人员。使用Scala处理大数据。如果您已经在使用Java并且在您的组织中更改它既困难又耗时,请使用Scala。如果你想添加一门新语言并且不能花太多时间,GO比Scala更容易使用,特别是如果你已经使用C++而不是Java。总而言之,GO的运行和雇佣成本都很低。它易于使用,可以在广泛的用例中采用。当您的核心应用程序仍然有另一种语言时,它也可以用作补充语言。Scala非常适合大型项目和大数据。如果您在JVM上投入了大量资金,那么Scala是一个常见的下一步。结论过去几年我一直在使用Go和Scala,两者各有优缺点。作为一名开发人员,我喜欢用Scala解决问题,它非常优雅、简洁且功能强大。使用起来很愉快;但在现实世界中,我倾向于更频繁地使用GO,因为我可以更快、更便宜地完成工作。当你为一家需要赚钱的公司工作时,这就是方式。由于快速的编译时间和部署时间以及极低的资源使用率,GO是云原生应用程序最具成本效益的语言。尽管如此,对于大数据和高并发的关键系统,Scala是最好的选择,而且它比GO更成熟。对于更大、更传统的企业,Scala通常更合适。