自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

大數(shù)據(jù)開發(fā)語言怎么選?Scala還是Go

開發(fā) 后端 大數(shù)據(jù)
自從我參與DevOps和大數(shù)據(jù)以來,我一直在使用兩種出色的但完全不同的編程語言:Go和Scala。

 介紹

自從我參與DevOps和大數(shù)據(jù)以來,我一直在使用兩種出色的但完全不同的編程語言:Go和Scala。

[[353823]]

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

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

簡而言之Scala

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

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

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

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

從每個值都是對象的意義上講,Scala是一種純面向?qū)ο蟮恼Z言。對象的類型和行為通過類和特征來描述。[1]

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

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

大數(shù)據(jù)開發(fā)語言怎么選?Scala 還是 Go 

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

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

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

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

  • 在JVM上運(yùn)行。 它具有多年來構(gòu)建的所有JVM優(yōu)化功能,并且與Java兼容。
  • 非常簡潔,與Java或GO相比,它需要更少的樣板代碼。
  • 函數(shù)式編程和面向?qū)ο蟆?/li>
  • 類型系統(tǒng)非常強(qiáng)大。 您可以為您的庫構(gòu)建自定義DSL,在編譯時執(zhí)行檢查等等。
  • 函數(shù)式編程的所有優(yōu)點(diǎn)。
  • 基于參與者Actor模型的Akka生態(tài)系統(tǒng)使其成為并發(fā)系統(tǒng)的絕佳選擇。
  • 強(qiáng)大的構(gòu)建工具。
  • 多才多藝。 Scala可用于表達(dá)任何類型的問題。

Scala 的缺點(diǎn)

  • 復(fù)雜。難以學(xué)習(xí)和掌握。通常由高級程序員使用。
  • 太廣泛了,表達(dá)同一件事的方法有一百種,每個Scala開發(fā)人員都有自己的風(fēng)格,并且在大型項目中很難保持代碼一致性。
  • Java的一些兼容性問題;同樣,如果您需要使用Java庫,那么它將剝奪Scala的優(yōu)勢。
  • 編譯速度慢。盡管有諸如Bloop之類的工具可以緩解問題。
  • 它繼承了云原生應(yīng)用程序的JVM問題,例如大型容器,緩慢的警告時間,難以調(diào)整,部署緩慢等。
  • 盡管用途廣泛,但Scala只是發(fā)現(xiàn)了某些場景,因此并未被廣泛采用。

用例

  • 大數(shù)據(jù)和分析。由于其強(qiáng)大的類型系統(tǒng)和可擴(kuò)展性,大數(shù)據(jù)領(lǐng)域中的許多工具(例如Spark)都使用Scala。它是數(shù)據(jù)工程師以及大型流和批處理引擎的首選語言。
  • 并發(fā)系統(tǒng)和實(shí)時應(yīng)用程序。 Akka框架以并發(fā)系統(tǒng)的可伸縮性而聞名,并廣泛用于使用JVM的交易服務(wù)和其他高度并發(fā)的系統(tǒng)。
  • 高度并發(fā)的API。Play框架提供了一個高度并發(fā)的Web框架,以構(gòu)建由Akka支持的應(yīng)用程序和API。
  • 巨石架構(gòu)。 對于大型整體應(yīng)用程序(甚至是分布式應(yīng)用程序),Scala是絕佳的選擇。 使用Akka群集,您可以在單個應(yīng)用程序內(nèi)創(chuàng)建高度分散的應(yīng)用程序。
  • 通常,Scala用于為特定領(lǐng)域(例如Akka或Spark)構(gòu)建框架和庫。

簡而言之

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

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

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

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

大數(shù)據(jù)開發(fā)語言怎么選?Scala 還是 Go 

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

  • 超快速的編譯器,感覺就像是一種解釋語言。很棒的開發(fā)人員經(jīng)驗??焖俚拈_發(fā)過程和提高的生產(chǎn)率。
  • 簡單安全,我對Go的鐘愛是通常只有一種表達(dá)問題的方式,這可以加快開發(fā),代碼審查以及整個開發(fā)過程的速度。
  • 非常適合初級和高級開發(fā)人員。 由于它不需要虛擬環(huán)境,因此非常容易學(xué)習(xí)和采用。
  • 云原生應(yīng)用程序和Kubernetes的完美選擇。由于體積小,沒有預(yù)熱時間和速度。
  • 借助Go Routines,并發(fā)變得容易。
  • 偉大的標(biāo)準(zhǔn)庫,其中包括Web服務(wù)器。
  • Go可以用于各種場景:CLI,Web應(yīng)用程序,流處理等。
  • 資源使用率極低。您可以在一臺服務(wù)器上運(yùn)行數(shù)百萬個Go例程。與JVM相比,它使用的RAM和CPU很少,因此運(yùn)行起來便宜得多。

Go 的缺點(diǎn)

  • 它不夠簡潔,很難保持代碼干燥。
  • 太簡單的基本事物(如泛型)在Go中不可用,盡管很快就會支持。
  • 這是一種相對較新的語言,沒有太多的庫或教程。
  • 依賴管理有點(diǎn)反常,很難管理,但是自從添加go mod以來,它已經(jīng)得到了改進(jìn)。 好消息是,go mod是語言的一部分,而不是像sbt這樣的單獨(dú)項目,盡管sbtis功能更強(qiáng)大。
  • 錯誤處理很麻煩。
  • 與Scala相比,它不夠優(yōu)雅,強(qiáng)大和靈活。
  • 與Scala相比,Go有點(diǎn)不成熟。

用例

  • CLI和腳本:像kubectl這樣的大多數(shù)CLI使用Go。
  • Web應(yīng)用程序。由于它是高度并發(fā)的,并且不需要太多資源,因此非常適合處理HTTP請求。
  • 流應(yīng)用程序。 Go可以使用Go例程快速處理數(shù)百萬個事件。 它是Scala中Akka流的競爭對手。
  • 微服務(wù)。 由于體積小,速度快且具有監(jiān)視功能,Go是云原生微服務(wù)的理想選擇。
  • 無服務(wù)器和云應(yīng)用程序。Go是無服務(wù)器功能的理想選擇,尤其是在Google Cloud中。

Scala vs Go

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

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

對于Web應(yīng)用程序,Play框架更適合有狀態(tài)的Web應(yīng)用程序或壽命長的應(yīng)用程序,在這些應(yīng)用程序中,JVM有足夠的時間來優(yōu)化應(yīng)用程序。 Scala非常適合迷你服務(wù)或整體應(yīng)用。 如果您需要與Akka集成,這也是一個不錯的選擇。 另一方面,GO更適合微服務(wù),云本機(jī)應(yīng)用程序和無服務(wù)器功能。 對于云中的無狀態(tài)API,我會使用GO,因為它更便宜,更容易。

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

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

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

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

性能

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

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

大數(shù)據(jù)開發(fā)語言怎么選?Scala 還是 Go 

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

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

推薦建議

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

  • 如果您是初級開發(fā)人員和/或沒有Java經(jīng)驗但具有Python或C ++經(jīng)驗,請學(xué)習(xí)GO。
  • 如果您想在云上,啟動和出色的項目中工作,請學(xué)習(xí)GO。
  • 如果您花不起數(shù)年的時間來學(xué)習(xí)一門新語言,請學(xué)習(xí)GO。
  • 如果您是開發(fā)流應(yīng)用程序和API的后端工程師,請學(xué)習(xí)GO。
  • 如果您擁護(hù)DevOps文化,請學(xué)習(xí)GO。
  • 如果您使用的是Google Cloud,請學(xué)習(xí)GO。
  • 使用GO編寫腳本和命令行工具,POC或超快速API。
  • 如果您是高級開發(fā)人員和/或Java開發(fā)人員,請學(xué)習(xí)Scala。
  • 如果您已經(jīng)使用JVM和/或在本地運(yùn)行,請學(xué)習(xí)Scala。
  • 如果您要使用Akka和Spark照顧高薪工作,請學(xué)習(xí)Scala。
  • 如果您在大數(shù)據(jù)上投入大量資金,請學(xué)習(xí)Scala。
  • 如果您想在更傳統(tǒng)的行業(yè)(例如金融機(jī)構(gòu))工作,請學(xué)習(xí)Scala。

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

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

  • 當(dāng)您沒有JVM依賴性并且可以在容器內(nèi)運(yùn)行二進(jìn)制應(yīng)用程序時,請使用GO。
  • 將GO用于無服務(wù)器功能而不是JVM。
  • 將GO用于在云或Kubernetes中管理的短期分布式Web應(yīng)用程序或API。
  • 將GO用于自定義腳本,小型作業(yè)和CLI。
  • 使用GO以很少的資源以低成本消耗和處理大量事件。
  • 如果您在云(特別是Google Cloud)中運(yùn)行,請使用GO。
  • 如果您依賴JVM或您的開發(fā)團(tuán)隊已經(jīng)熟悉Java,請使用Scala。
  • 將Scala用于利用JVM優(yōu)化的高并發(fā)分布式系統(tǒng)。
  • 將Scala用于大數(shù)據(jù),尤其是Spark。
  • 如果您的Java應(yīng)用程序存在擴(kuò)展問題,請使用Scala。

總而言之,GO是一種消耗很少且易于采用的二進(jìn)制語言,對于您的工具帶來說它是一個不錯的工具,但是我不會將它用作大型組織的唯一編程語言,因為它不那么通用和其他語言一樣。Scala更加困難,但是如果您已經(jīng)在使用Java,那么這是一個很好的下一步。

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

  • 使用GO作為節(jié)省成本的機(jī)制。Go比Scala便宜,不僅Gogo使用更少的資源,而且開發(fā)人員的薪水更低。
  • 將GO用于無服務(wù)器或Kubernetes。
  • 使用GO吸引年輕的人才,并將公司介紹為一家初創(chuàng)公司。
  • 由于您的大多數(shù)GCP服務(wù)都基于GO API,因此如果您在Google Cloud中運(yùn)行,請使用GO。
  • 將Scala用于關(guān)鍵的并發(fā)應(yīng)用程序,整體或?qū)崟r系統(tǒng)。
  • 使用Scala吸引高技能的高級開發(fā)人員。
  • 將Scala用于大數(shù)據(jù)。
  • 如果您已經(jīng)在使用Java,并且難以在組織中進(jìn)行更改且需要花費(fèi)時間,請使用Scala。
  • 如果您想添加一種新的語言并且不能花費(fèi)太多時間,GO的使用比Scala容易得多,特別是如果您已經(jīng)使用C ++而不是Java。

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

結(jié)論

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

 

責(zé)任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2016-10-10 14:05:46

存儲

2022-01-21 08:02:04

開發(fā)

2014-08-15 09:09:32

大數(shù)據(jù)

2020-12-29 06:44:18

GoScala編程語言

2022-05-05 08:13:16

Go數(shù)組類型

2021-01-18 18:30:49

服務(wù)器開發(fā)工具

2021-01-19 05:26:22

Github ActiJenkinsDevOps

2009-07-08 12:43:59

Scala ServlScala語言

2015-08-04 09:40:10

Python大數(shù)據(jù)全棧式

2021-01-31 18:58:31

redismemcache源碼

2022-03-13 23:51:39

Web項目Go

2012-05-14 10:54:35

數(shù)據(jù)信息

2015-08-12 15:10:22

2012-06-08 09:28:15

EclipseScalaAndroid

2014-01-07 10:12:15

Spark

2024-06-25 13:08:31

2018-06-24 09:12:33

redismemcache源碼

2017-08-02 08:56:43

大數(shù)據(jù)技術(shù)SaaS

2019-10-31 17:06:59

開發(fā)技能代碼

2019-11-01 10:27:48

GoJava語言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號