大數據開發語言怎麼選?Scala還是Go

2020-12-24 51CTO

介紹

自從我參與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往往更適合。

【編輯推薦】

【責任編輯:

華軒

TEL:(010)68476606】

點讚 0

相關焦點

  • 大數據入門:Scala大數據黃金語言
    在大數據的學習當中,關於程式語言選擇的部分,是很多人在學習初期非常關注的。在企業大數據平臺開發場景下,Java語言是主流選擇,其次涉及到Spark部分,就不得不提到Scala語言。今天的大數據入門分享,我們就具體來講一講大數據黃金語言Scala。
  • Spark專輯:從Scala開始(一)
    Spark也是基於JVM,我們構築分布式系統,藉助JVM,而不一定是Java語言。Spark和消息中間件KAFKA等都是用Scala編寫的,學好Scala是掌握Spark的關鍵。 Scala和Java的關係:Scala是純面向對象的語言Scala是面向對象和函數式結合的語言。
  • 多面程式語言Scala
    Scala的面向對象開胃菜──類的定義來看個開胃菜,定義一個類:我們知道,動態語言一般都提供了REPL環境,同時,動態語言的程序代碼都是以腳本方式解釋運行的,這給開發帶來了不少的便利。Scala雖然是靜態類型系統的語言,但同樣提供了這兩個福利,讓你倍感貼心。因此,你可以任意採取以下運行方式:測試信息「小強今年32歲,是一名程式設計師」結果出來了!多麼簡單,類的定義就這麼多,卻能夠做這麼多事情,想想Java的實現吧,差別太大了。我們先來分析下代碼。
  • 大數據開發中最常用的程式語言
    在本文中,我跟大家來分享一下大數據開發中最常用的5種程式語言。大數據倉庫ScalaScala是面向對象和函數式編程範例的完美結合,它既快速又健壯,並且是許多大數據專業人士常用的語言選擇。儘管Python語言非常簡單易用,但是大數據專業人員發現使用Java或Scala等語言構建的系統比使用Python來說要更快速,更強大。但是,Python在其他方面優秀的表現彌補了這一缺點。由於Python主要是一種腳本語言,因此交互式編碼使得大數據分析的開發變得容易。
  • Go 語言實戰(1): 初識
    Java:桌面、Android、web 服務如果不需要跟硬體和系統深入打交道,對性能要求不那麼極端,又考慮開發效率,Java 則是最主流的選擇。JVM 屏蔽了部分技術細節,背後又有多年積累的強大第三方類庫(尤其是 Spring 的一系列框架),使 Java 成為企業級軟體開發的不二之選。
  • 大數據開發有哪些工作?大數據開發與人工智慧開發的區別-開課吧
    隨著大數據的發展,對相關專業人才的需求也在不斷增加,包括大數據開發、數據分析與挖掘等不同的數據處理環節,都形成了相應的崗位體系,每個環節由各自負責,共同完成大數據處理任務。現在我們主要談談大數據開發就業,了解一下大數據開發有哪些工作?
  • 學習大數據是否意味著一定要學習Java語言
    首先,當前大數據的技術體系還是比較龐大的,並不是所有大數據從業者都需要掌握Java編程,所以也並不是所有人在學習大數據的時候,都需要學習Java。Java語言在大數據平臺開發領域有比較普遍的應用,比如基於Hadoop的大數據平臺開發,通常都會採用Java語言。另外,Python也是大數據平臺開發崗位比較常見的程式語言之一。從當前的發展趨勢來看,未來Go語言在大數據平臺開發領域也許會有更大的空間,這主要得益於Go語言自身效率至上的設計模式。
  • 初學者入門大數據,為什麼要先學習一門程式語言?
    很多人了解到大數據發展的前景和空間很好,適合發展自己的職業生涯,那麼零基礎的新手想轉行學習大數據,可是,在進入正式的大數據技術學習之前,0基礎為什麼要先學習一門程式語言作為基礎呢?想必這也是很多想轉行大數據的童鞋存在的疑問,今天加米谷大數據就來解答一下。首先,0基礎入門大數據,先從一門程式語言入手。加米谷大數據建議,如果你想往大數據開發方向走,學習Java,想學數據分析或者數據挖掘,那就選Python。為什麼一開始的入門要學習編程呢?
  • 2020年頂級大數據程式語言有哪些?
    目前全世界的開發人員,編碼人員和軟體工程師都使用許多程式語言。根據一項調查,計算機語言的總數總計達9000種。但是,如今,其中只有50種程式語言是首選。程式語言會根據大數據和AI等行業而有所不同。科技市場由大數據主導,因此,如果作為大數據專業人士,必須學習最重要的程式語言。大數據中最喜歡的程式語言:PythonPython在全球擁有500萬用戶,目前被其視為開發人員最常用的程式語言之一。
  • 2020年Go語言盤點:新冠大流行阻擋不了Go演進的步伐
    這恰說明 Go 語言的開發與推廣工作得到了更多來自全球的開發者的認可。在這篇文章中,我們就來做一下 2020 年 Go 語言的盤點,看看在 2020 年圍繞 Go 語言、Go 社區和 Go 生態圈都發生了哪些有影響和有意義的事情。1. 面對大流行,Go 核心團隊給出「定心丸」大流行始於 2020 年 1 月的武漢,但真正的全球大流行則大致始於 2020 年 3 月。
  • NSQ:基於Go語言的分布式實時消息平臺
    如果你希望更多的在朋友圈見到極客邦,看到InfoQ的精彩內容,尋找我們主辦與支持的給力活動;如果你希望能更經常地與我們聯繫,隔三差五調戲我們一下,那就複製微信號:HelloStuQ ,加Q妹的個人微信吧~NSQ是一個基於Go語言的分布式實時消息平臺,它基於MIT開源協議發布,代碼託管在GitHub,其當前最新版本是0.3.1
  • 大數據場景中語言虛擬機的應用和挑戰
    上海 200240摘要:語言虛擬機為大數據應用提供了與平臺無關的執行環境,簡化了應用的開發和部署,因此在大數據場景中得到了較廣泛的應用。其中,為Java提供的Java虛擬機(Java virtual machine,JVM)和為.NET提供的公共語言運行時(common language runtime,CLR)是大數據處理系統的主要選擇,其中JVM廣泛用於開源的大數據系統,而CLR則主要部署於微軟公司的實際生產系統中。語言虛擬機在為大數據應用開發提供便利的同時,也帶來了一系列挑戰。
  • 2019年最實用的程式語言
    學習編程關鍵是要找到一種合適的語言,那麼程式語言那麼多,該如何選擇?下面萬古網校小編為大家分享一篇關於程式語言選擇的文章,希望能給你帶來幫助!第一大類語言包括Java、C、Python和C++。這類語言都是非常通用的語言,它們並不局限於特定的編程平臺或用途。
  • C語言在遊戲開發中起到什麼作用?
    一、 C語言的總體C語言是非常多語言的基礎,C++,JAVA等都包含在其中,C語言可以編寫作業系統和應用軟體,是十分重要的開發語言。二、 C語言在遊戲開發中的優點:1. 強大的繪圖能力。2. 適用範圍大,可移植性好。3.
  • 用手機製作自己app軟體_手機開發app的軟體_app是怎麼開發的
    用手機製作自己app軟體也成為大家關心的問題,今天小編就為大家介紹手機開發app的軟體_app是怎麼開發的開發APP,什麼伺服器比較好?製作app軟體要多少錢?一、用手機製作自己app軟體_手機開發app的軟體_app是怎麼開發的?
  • 敏捷開發框架的開發運用之大數據平臺的構建
    JNPF敏捷開發框架的第九個重量級運用是大數據平臺的構建。現今社會是一個高速發展的時代,科技發達,信息流通,人們之間的交流越來越密切,生活也越來越方便,大數據就是這個高科技時代的產物。馬雲曾在演講中就提到,未來的時代將不是IT時代,而是DT的時代,DT就是Data Technology數據科技。這就是說明了大數據運用在當下以及未來,對社會以及各行各業發展的關鍵性作用。那一般的企事業單位應該如何打造大數據平臺,其實運用引邁的JNPF敏捷開發框架即可輕鬆快速的開發打造,而無需各種複雜高投入的大數據設備。
  • C語言和彙編語言在開發單片機時各有哪些優缺點?
    其優點是可讀性好,移植容易,是普遍使用的一種計算機語言。缺點是佔用資源較多,執行效率沒有彙編高。 對於目前普遍使用的RISC架構的8bit MCU來說,其內部ROM、RAM、STACK等資源都有限,如果使用C語言編寫,一條C語言指令編譯後,會變成很多條機器碼,很容易出現ROM空間不夠、堆棧溢出等問題。而且一些單片機廠家也不一定能提供C編譯器。
  • 梅河口市大數據開發與應用項目
    、採集、存儲、加工、分析、服務為主的相關經濟活動,包括數據資源建設、大數據軟硬體產品的開發、銷售和租賃活動以及相關信息技術服務。   項目擬建在梅河口市,通過合作,拓展大數據開發與應用業務市場。在已披露的融資併購事件中,資本更熱衷於投向掌握行業應用產品和服務的企業,或具有行業應用開發潛力的公司,其中行業化應用(如金融大數據、旅遊大數據、交通大數據等)和垂直化應用(如智能營銷、業務性能管理、移動開發者服務等)的融資併購頻繁。
  • 手機淘寶是用什麼語言開發的?
    所有後來很多電商網站開發的時候,雖然定位與淘寶不同,但是技術上都是直接對標淘寶商城開發的。那麼手機淘寶是用什麼語言開發的,我們如果需要搭建一個像淘寶這樣的網站,用什麼語言比較好呢?下面由HiShop小編來為你一一解答。一、手機淘寶是用什麼語言開發的?
  • 一文搞懂Go語言中的切片排序
    好在現在有https://go2goplay.golang.org/可以用於試驗go泛型技術草案中的語法。形式上的確如此,但內涵上還是有差別的。使用泛型方案, 由於少了到interface{}的裝箱和拆箱操作,理論上SliceFn的性能要好於sort.Slice函數。