您好,登錄后才能下訂單哦!
本篇內(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]
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的文章。
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是更好的選擇。
> 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í)用文章!
免責(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)容。