溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

大數(shù)據(jù)開(kāi)發(fā)語(yǔ)言用Scala還是Go好

發(fā)布時(shí)間:2021-07-20 18:11:12 來(lái)源:億速云 閱讀:739 作者:chen 欄目:編程語(yǔ)言

本篇內(nèi)容介紹了“大數(shù)據(jù)開(kāi)發(fā)語(yǔ)言用Scala還是Go好”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

Scala是一種較舊且更成熟的編程語(yǔ)言,已在并發(fā)編程和大數(shù)據(jù)處理等領(lǐng)域找到了自己的定位。 另一方面,Go是Google為克服C  ++的批評(píng)而創(chuàng)建的一種更新,更簡(jiǎn)單的語(yǔ)言。 設(shè)計(jì)考慮多核處理器的語(yǔ)言。

兩者都是出色的語(yǔ)言,可以為并發(fā)應(yīng)用程序和流處理實(shí)現(xiàn)出色的性能,但是它們的設(shè)計(jì)卻大不相同。在本文中,我將嘗試為您簡(jiǎn)要介紹這兩種語(yǔ)言,它們的優(yōu)缺點(diǎn),并回顧一些實(shí)際的用詞情況,在這些情況下,我們將推薦一種語(yǔ)言而不是另一種語(yǔ)言。

簡(jiǎn)而言之Scala

Scala是一種由學(xué)者創(chuàng)建的編程語(yǔ)言,它是在JVM上運(yùn)行的Java的第一種替代方法。 它定義為:

Scala是一種現(xiàn)代的多范式編程語(yǔ)言,旨在以簡(jiǎn)潔,優(yōu)雅且類(lèi)型安全的方式表達(dá)常見(jiàn)的編程模式。[1]

Scala既面向功能又面向?qū)ο?,提供了兩全其美的?yōu)勢(shì)。 它具有定義程序的靈活方式,并且由您決定如何描述它們:從純函數(shù)式編程到純面向?qū)ο蟮木幊獭?/p>

像Java一樣,Scala是面向?qū)ο蟮模?/p>

從每個(gè)值都是對(duì)象的意義上講,Scala是一種純面向?qū)ο蟮恼Z(yǔ)言。對(duì)象的類(lèi)型和行為通過(guò)類(lèi)和特征來(lái)描述。[1]

它還為功能編程和強(qiáng)大的靜態(tài)類(lèi)型系統(tǒng)提供支持。 與Java不同,Scala具有功能編程語(yǔ)言的許多功能,例如Scheme,Standard  ML和Haskell,包括currying,類(lèi)型推斷,不變性,惰性評(píng)估和模式匹配。  它還具有一個(gè)高級(jí)類(lèi)型系統(tǒng),該系統(tǒng)支持代數(shù)數(shù)據(jù)類(lèi)型,協(xié)方差和對(duì)數(shù),高階類(lèi)型(但不包括高階類(lèi)型)和匿名類(lèi)型。

從每個(gè)功能都是一個(gè)值的意義上講,Scala也是一種功能語(yǔ)言。  Scala提供了用于定義匿名函數(shù)的輕量級(jí)語(yǔ)法,它支持高階函數(shù),它允許嵌套函數(shù),并支持currying。[1]

大數(shù)據(jù)開(kāi)發(fā)語(yǔ)言用Scala還是Go好 

Java中不存在的Scala的其他功能包括運(yùn)算符重載,可選參數(shù),命名參數(shù)和原始字符串。  相反,Scala中沒(méi)有的Java功能就是檢查異常,事實(shí)證明這是有爭(zhēng)議的。

在其他用例中,Scala在大數(shù)據(jù)中被大量使用。 諸如Twitter之類(lèi)的公司轉(zhuǎn)移到Scala,特別是因?yàn)楦玫牟l(fā)支持。  Scala功能強(qiáng)大,但很難學(xué)習(xí),并且仍然存在與Java的兼容性問(wèn)題。

Scala使用的兩個(gè)關(guān)鍵驅(qū)動(dòng)因素是基于用于并行編程的actor系統(tǒng)的Akka框架和用于大數(shù)據(jù)的Spark處理引擎。  由于其學(xué)術(shù)性質(zhì),與Akka或Spark以外的其他語(yǔ)言相比,Scala在實(shí)際單詞中沒(méi)有發(fā)現(xiàn)太多用法。 盡管它在金融機(jī)構(gòu)中大量使用。

Scala 的優(yōu)點(diǎn)

  • 在JVM上運(yùn)行。 它具有多年來(lái)構(gòu)建的所有JVM優(yōu)化功能,并且與Java兼容。

  • 非常簡(jiǎn)潔,與Java或GO相比,它需要更少的樣板代碼。

  • 函數(shù)式編程和面向?qū)ο蟆?/p>

  • 類(lèi)型系統(tǒng)非常強(qiáng)大。 您可以為您的庫(kù)構(gòu)建自定義DSL,在編譯時(shí)執(zhí)行檢查等等。

  • 函數(shù)式編程的所有優(yōu)點(diǎn)。

  • 基于參與者Actor模型的Akka生態(tài)系統(tǒng)使其成為并發(fā)系統(tǒng)的絕佳選擇。

  • 強(qiáng)大的構(gòu)建工具。

  • 多才多藝。 Scala可用于表達(dá)任何類(lèi)型的問(wèn)題。

Scala 的缺點(diǎn)

  • 復(fù)雜。難以學(xué)習(xí)和掌握。通常由高級(jí)程序員使用。

  • 太廣泛了,表達(dá)同一件事的方法有一百種,每個(gè)Scala開(kāi)發(fā)人員都有自己的風(fēng)格,并且在大型項(xiàng)目中很難保持代碼一致性。

  • Java的一些兼容性問(wèn)題;同樣,如果您需要使用Java庫(kù),那么它將剝奪Scala的優(yōu)勢(shì)。

  • 編譯速度慢。盡管有諸如Bloop之類(lèi)的工具可以緩解問(wèn)題。

  • 它繼承了云原生應(yīng)用程序的JVM問(wèn)題,例如大型容器,緩慢的警告時(shí)間,難以調(diào)整,部署緩慢等。

  • 盡管用途廣泛,但Scala只是發(fā)現(xiàn)了某些場(chǎng)景,因此并未被廣泛采用。

用例

  • 大數(shù)據(jù)和分析。由于其強(qiáng)大的類(lèi)型系統(tǒng)和可擴(kuò)展性,大數(shù)據(jù)領(lǐng)域中的許多工具(例如Spark)都使用Scala。它是數(shù)據(jù)工程師以及大型流和批處理引擎的首選語(yǔ)言。

  • 并發(fā)系統(tǒng)和實(shí)時(shí)應(yīng)用程序。 Akka框架以并發(fā)系統(tǒng)的可伸縮性而聞名,并廣泛用于使用JVM的交易服務(wù)和其他高度并發(fā)的系統(tǒng)。

  • 高度并發(fā)的API。Play框架提供了一個(gè)高度并發(fā)的Web框架,以構(gòu)建由Akka支持的應(yīng)用程序和API。

  • 巨石架構(gòu)。 對(duì)于大型整體應(yīng)用程序(甚至是分布式應(yīng)用程序),Scala是絕佳的選擇。  使用Akka群集,您可以在單個(gè)應(yīng)用程序內(nèi)創(chuàng)建高度分散的應(yīng)用程序。

  • 通常,Scala用于為特定領(lǐng)域(例如Akka或Spark)構(gòu)建框架和庫(kù)。

簡(jiǎn)而言之

Go是另一種野獸。與Scala相比,它不那么優(yōu)雅,功能強(qiáng)大或簡(jiǎn)潔,但它是為特定目的而構(gòu)建的,并且做得非常好。

Go由Google創(chuàng)建,并且在語(yǔ)法上與C類(lèi)似。它的目標(biāo)是通過(guò)添加內(nèi)存安全性,垃圾回收,結(jié)構(gòu)化類(lèi)型來(lái)克服C  ++中存在的不安全操作。它非常容易學(xué)習(xí)和使用。它是為多核計(jì)算機(jī)而構(gòu)建的,以最大程度地提高并發(fā)程序的并行性。它使用稱(chēng)為Go  Routines的非常輕量級(jí)的綠色線程進(jìn)行并發(fā)編程。

Go可以快速編譯為機(jī)器代碼,但具有垃圾回收的便利性和運(yùn)行時(shí)反射的功能。這是一種快速的,靜態(tài)類(lèi)型的編譯語(yǔ)言,感覺(jué)就像是一種動(dòng)態(tài)類(lèi)型的解釋語(yǔ)言。[2]

Go很小,但是它涵蓋了許多用例,例如微服務(wù),流處理,CLI等。 Golang為在不同平臺(tái)上生成二進(jìn)制文件提供了出色的支持,而無(wú)需在目標(biāo)上安裝Go。  由于二進(jìn)制文件小而有效,因此非常適合使用Containers打包的云本機(jī)應(yīng)用程序。  您的應(yīng)用程序容器可以打包到一個(gè)很小的容器(?5–10MB)中,只需幾秒鐘即可部署,這使其成為比JVM語(yǔ)言更好的微服務(wù)選擇。  有關(guān)更多信息,請(qǐng)查看我有關(guān)在Kubernetes中部署Go Microservices的文章。

大數(shù)據(jù)開(kāi)發(fā)語(yǔ)言用Scala還是Go好 

Go 的優(yōu)點(diǎn)

  • 超快速的編譯器,感覺(jué)就像是一種解釋語(yǔ)言。很棒的開(kāi)發(fā)人員經(jīng)驗(yàn)??焖俚拈_(kāi)發(fā)過(guò)程和提高的生產(chǎn)率。

  • 簡(jiǎn)單安全,我對(duì)Go的鐘愛(ài)是通常只有一種表達(dá)問(wèn)題的方式,這可以加快開(kāi)發(fā),代碼審查以及整個(gè)開(kāi)發(fā)過(guò)程的速度。

  • 非常適合初級(jí)和高級(jí)開(kāi)發(fā)人員。 由于它不需要虛擬環(huán)境,因此非常容易學(xué)習(xí)和采用。

  • 云原生應(yīng)用程序和Kubernetes的完美選擇。由于體積小,沒(méi)有預(yù)熱時(shí)間和速度。

  • 借助Go Routines,并發(fā)變得容易。

  • 偉大的標(biāo)準(zhǔn)庫(kù),其中包括Web服務(wù)器。

  • Go可以用于各種場(chǎng)景:CLI,Web應(yīng)用程序,流處理等。

  • 資源使用率極低。您可以在一臺(tái)服務(wù)器上運(yùn)行數(shù)百萬(wàn)個(gè)Go例程。與JVM相比,它使用的RAM和CPU很少,因此運(yùn)行起來(lái)便宜得多。

Go 的缺點(diǎn)

  • 它不夠簡(jiǎn)潔,很難保持代碼干燥。

  • 太簡(jiǎn)單的基本事物(如泛型)在Go中不可用,盡管很快就會(huì)支持。

  • 這是一種相對(duì)較新的語(yǔ)言,沒(méi)有太多的庫(kù)或教程。

  • 依賴(lài)管理有點(diǎn)反常,很難管理,但是自從添加go mod以來(lái),它已經(jīng)得到了改進(jìn)。 好消息是,go  mod是語(yǔ)言的一部分,而不是像sbt這樣的單獨(dú)項(xiàng)目,盡管sbtis功能更強(qiáng)大。

  • 錯(cuò)誤處理很麻煩。

  • 與Scala相比,它不夠優(yōu)雅,強(qiáng)大和靈活。

  • 與Scala相比,Go有點(diǎn)不成熟。

用例

  • CLI和腳本:像kubectl這樣的大多數(shù)CLI使用Go。

  • Web應(yīng)用程序。由于它是高度并發(fā)的,并且不需要太多資源,因此非常適合處理HTTP請(qǐng)求。

  • 流應(yīng)用程序。 Go可以使用Go例程快速處理數(shù)百萬(wàn)個(gè)事件。 它是Scala中Akka流的競(jìng)爭(zhēng)對(duì)手。

  • 微服務(wù)。 由于體積小,速度快且具有監(jiān)視功能,Go是云原生微服務(wù)的理想選擇。

  • 無(wú)服務(wù)器和云應(yīng)用程序。Go是無(wú)服務(wù)器功能的理想選擇,尤其是在Google Cloud中。

Scala vs Go

Scala 編程語(yǔ)言是強(qiáng)類(lèi)型,具有垃圾回收器,它們安全,高度并發(fā),并且每秒可以處理數(shù)百萬(wàn)條記錄。

對(duì)于流處理,Go更易于使用,但依賴(lài)于發(fā)布/訂閱系統(tǒng)(例如Kafka)和NoSQL數(shù)據(jù)庫(kù)(例如Cassandra)。  Akka本身就是一頭野獸,可以自己管理大量請(qǐng)求而沒(méi)有任何依賴(lài)關(guān)系,它還提供了更多這樣的背壓。

對(duì)于Web應(yīng)用程序,Play框架更適合有狀態(tài)的Web應(yīng)用程序或壽命長(zhǎng)的應(yīng)用程序,在這些應(yīng)用程序中,JVM有足夠的時(shí)間來(lái)優(yōu)化應(yīng)用程序。  Scala非常適合迷你服務(wù)或整體應(yīng)用。 如果您需要與Akka集成,這也是一個(gè)不錯(cuò)的選擇。 另一方面,GO更適合微服務(wù),云本機(jī)應(yīng)用程序和無(wú)服務(wù)器功能。  對(duì)于云中的無(wú)狀態(tài)API,我會(huì)使用GO,因?yàn)樗阋?,更容易?/p>

Go提供了強(qiáng)大的支持gRPC為內(nèi)部微服務(wù)提供了絕佳的選擇,這些微服務(wù)可以以流的方式快速使用。

對(duì)于大數(shù)據(jù),Scala或Python是最佳選擇。 GO在大數(shù)據(jù)世界中仍處于起步階段。

通常,Go的運(yùn)行和租賃成本較低。 因此,如果成本是一個(gè)問(wèn)題,請(qǐng)研究GO。 另一方面,Scala開(kāi)發(fā)人員往往是非常好的工程師,這也為組織帶來(lái)了價(jià)值。

隨著應(yīng)用程序的增長(zhǎng),GO源代碼將變得越來(lái)越難以維護(hù),因此我不建議將其作為整體使用,對(duì)于更穩(wěn)定,規(guī)模更大的項(xiàng)目,Scala是更好的選擇,尤其是對(duì)于更傳統(tǒng)的企業(yè)。

性能

這是一個(gè)棘手的問(wèn)題,如果您在Google vs GO的性能方面會(huì)找到幾篇文章,并且根據(jù)測(cè)試結(jié)果會(huì)有所不同。  剛開(kāi)始,GO似乎在簡(jiǎn)單的用例上表現(xiàn)更好,但在實(shí)際情況下,Scala以及特別是Play Framework確實(shí)趕上了JIT  JVM優(yōu)化,該優(yōu)化在運(yùn)行時(shí)會(huì)調(diào)整字節(jié)碼添加優(yōu)化。

對(duì)于微服務(wù),無(wú)狀態(tài)應(yīng)用程序和容器化應(yīng)用程序,GO將更快,更輕量,這是一個(gè)巨大的優(yōu)勢(shì)。 通常,如果成本對(duì)您來(lái)說(shuō)很重要,那么GO將占上風(fēng)。  對(duì)于復(fù)雜的應(yīng)用程序,整體式狀態(tài)處理,Scala是更好的選擇。

大數(shù)據(jù)開(kāi)發(fā)語(yǔ)言用Scala還是Go好 

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

對(duì)于流處理,這是相同的故事。 Akka功能強(qiáng)大且優(yōu)雅,具有龐大的生態(tài)系統(tǒng)并具有更多功能,但使用,開(kāi)發(fā)和優(yōu)化都很復(fù)雜。  如果您有一支由Akka開(kāi)發(fā)人員組成的優(yōu)秀團(tuán)隊(duì),他們可以編寫(xiě)一個(gè)單例文件,比GO更快地處理事件。 但是,GO擴(kuò)展非常簡(jiǎn)單。

推薦建議

如果您是開(kāi)發(fā)人員…

  • 如果您是初級(jí)開(kāi)發(fā)人員和/或沒(méi)有Java經(jīng)驗(yàn)但具有Python或C ++經(jīng)驗(yàn),請(qǐng)學(xué)習(xí)GO。

  • 如果您想在云上,啟動(dòng)和出色的項(xiàng)目中工作,請(qǐng)學(xué)習(xí)GO。

  • 如果您花不起數(shù)年的時(shí)間來(lái)學(xué)習(xí)一門(mén)新語(yǔ)言,請(qǐng)學(xué)習(xí)GO。

  • 如果您是開(kāi)發(fā)流應(yīng)用程序和API的后端工程師,請(qǐng)學(xué)習(xí)GO。

  • 如果您擁護(hù)DevOps文化,請(qǐng)學(xué)習(xí)GO。

  • 如果您使用的是Google Cloud,請(qǐng)學(xué)習(xí)GO。

  • 使用GO編寫(xiě)腳本和命令行工具,POC或超快速API。

  • 如果您是高級(jí)開(kāi)發(fā)人員和/或Java開(kāi)發(fā)人員,請(qǐng)學(xué)習(xí)Scala。

  • 如果您已經(jīng)使用JVM和/或在本地運(yùn)行,請(qǐng)學(xué)習(xí)Scala。

  • 如果您要使用Akka和Spark照顧高薪工作,請(qǐng)學(xué)習(xí)Scala。

  • 如果您在大數(shù)據(jù)上投入大量資金,請(qǐng)學(xué)習(xí)Scala。

  • 如果您想在更傳統(tǒng)的行業(yè)(例如金融機(jī)構(gòu))工作,請(qǐng)學(xué)習(xí)Scala。

簡(jiǎn)而言之,GO既有趣又酷,易于學(xué)習(xí)且簡(jiǎn)單。在3個(gè)月內(nèi),您可以編寫(xiě)可用于實(shí)際用途的生產(chǎn)就緒應(yīng)用程序。Scala既有趣,復(fù)雜又具有挑戰(zhàn)性,但回報(bào)頗豐,它的薪酬很高,而且聲望更高,特別是在大數(shù)據(jù)世界中。

如果您是技術(shù)主管…

  • 當(dāng)您沒(méi)有JVM依賴(lài)性并且可以在容器內(nèi)運(yùn)行二進(jìn)制應(yīng)用程序時(shí),請(qǐng)使用GO。

  • 將GO用于無(wú)服務(wù)器功能而不是JVM。

  • 將GO用于在云或Kubernetes中管理的短期分布式Web應(yīng)用程序或API。

  • 將GO用于自定義腳本,小型作業(yè)和CLI。

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

  • 如果您在云(特別是Google Cloud)中運(yùn)行,請(qǐng)使用GO。

  • 如果您依賴(lài)JVM或您的開(kāi)發(fā)團(tuán)隊(duì)已經(jīng)熟悉Java,請(qǐng)使用Scala。

  • 將Scala用于利用JVM優(yōu)化的高并發(fā)分布式系統(tǒng)。

  • 將Scala用于大數(shù)據(jù),尤其是Spark。

  • 如果您的Java應(yīng)用程序存在擴(kuò)展問(wèn)題,請(qǐng)使用Scala。

總而言之,GO是一種消耗很少且易于采用的二進(jìn)制語(yǔ)言,對(duì)于您的工具帶來(lái)說(shuō)它是一個(gè)不錯(cuò)的工具,但是我不會(huì)將它用作大型組織的唯一編程語(yǔ)言,因?yàn)樗荒敲赐ㄓ煤推渌Z(yǔ)言一樣。Scala更加困難,但是如果您已經(jīng)在使用Java,那么這是一個(gè)很好的下一步。

如果您是經(jīng)理…

  • 使用GO作為節(jié)省成本的機(jī)制。Go比Scala便宜,不僅Gogo使用更少的資源,而且開(kāi)發(fā)人員的薪水更低。

  • 將GO用于無(wú)服務(wù)器或Kubernetes。

  • 使用GO吸引年輕的人才,并將公司介紹為一家初創(chuàng)公司。

  • 由于您的大多數(shù)GCP服務(wù)都基于GO API,因此如果您在Google Cloud中運(yùn)行,請(qǐng)使用GO。

  • 將Scala用于關(guān)鍵的并發(fā)應(yīng)用程序,整體或?qū)崟r(shí)系統(tǒng)。

  • 使用Scala吸引高技能的高級(jí)開(kāi)發(fā)人員。

  • 將Scala用于大數(shù)據(jù)。

  • 如果您已經(jīng)在使用Java,并且難以在組織中進(jìn)行更改且需要花費(fèi)時(shí)間,請(qǐng)使用Scala。

  • 如果您想添加一種新的語(yǔ)言并且不能花費(fèi)太多時(shí)間,GO的使用比Scala容易得多,特別是如果您已經(jīng)使用C ++而不是Java。

總而言之,GO的運(yùn)行和雇用人才便宜。 它易于使用,可以在廣泛的用例中采用。 當(dāng)您仍然是核心應(yīng)用程序的另一種語(yǔ)言時(shí),它也可以用作補(bǔ)充語(yǔ)言。  Scala非常適合大型項(xiàng)目和大數(shù)據(jù)。 如果您在JVM上投入了大量資金,則Scala是常見(jiàn)的下一步。

結(jié)論

在過(guò)去的幾年中,我一直在使用Go和Scala,兩者都有其優(yōu)點(diǎn)和缺點(diǎn)。作為開(kāi)發(fā)人員,我喜歡在Scala中解決問(wèn)題,它非常優(yōu)雅,簡(jiǎn)潔,強(qiáng)大。和使用的喜悅;但是在現(xiàn)實(shí)世界中,我傾向于更頻繁地使用GO,因?yàn)槲铱梢愿?,更便宜地完成工作。?dāng)您在需要賺錢(qián)的公司工作時(shí),這就是這種方式。由于快速的編譯時(shí)間和部署時(shí)間以及極低的資源使用率,GO是用于云原生應(yīng)用程序的最具成本效益的語(yǔ)言。盡管如此,對(duì)于大數(shù)據(jù)和高度并發(fā)的關(guān)鍵系統(tǒng)來(lái)說(shuō),Scala是最佳選擇,它也比GO更成熟。對(duì)于更大,更傳統(tǒng)的企業(yè),Scala往往更適合。

“大數(shù)據(jù)開(kāi)發(fā)語(yǔ)言用Scala還是Go好”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI