大數據開發語言怎么選?Scala還是Go
介紹
自從我參與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]

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的文章。

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是更好的選擇。

> 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往往更適合。