近幾年有服務端有哪些新技術?
從10年到現在,客戶端或者說前端時不時的出現各種新技術,比如說,vr,ar。圖形方面的技術,感覺突然之間有了突飛猛進的感覺。但是服務端,卻感覺沒有一下子消沉下去了,那近幾年服務端是不是有新的進展呢?
tcp擁塞控制新演算法,比如BBR真正分散式強一致關係型資料庫,比如 TiDB容器技術 docker
微服務框架,甚至更激進的FaaS
Gpu集群超大規模機器學習平台Go語言基於Dpdk的應用層協議棧SDN協程開發或者async/await語義(隱式的封裝使用了協程或者線程)已經成為後台服務開發框架的主流,不管你是用go 還是nodejs 甚至C++。據我所知,很多互聯網大廠都有了自己的in house C/C++協程框架。
我寫的call_in_stack yuanzhubi/call_in_stack就是來輔助任何C++的有棧協程框架來節省堆棧的。
MicroService
Serverless -&> BaaS FaaS
DevOPS -&> Docker, Kubernetes建議再學習一下Spring Cloud,後端集大成者大部分人認為後端只是寫寫代碼,無外乎換換語言,換換框架、模型,當然沒啥大變化。
Micro Service 怎麼結合業務落地?Serverless 有沒有必要?Unikernel 進展如何?Docker 編排到底哪家強?SDN 發展到第幾代了?TCP with BBR 到底快多少?NoSQL 除了 Mongo 是不是還有更好的選擇?強一致的異地存儲怎麼走線?大數據怎樣玩的溜?AI有啥用?這行真是越來越難做了。後端是以不變應萬變。
前端是以萬變應不變。
我司前後端分離,後端準點下班,前端經常通宵
後端現在流行讓前段來寫nodejs, 然後原本的後端每天睡覺休息.
一個是協程,微線程,用戶態線程之類的東東。二是lock free,wait free線程間數據傳輸方案。尤其是wait free單隊列性能每秒3億,可傳送任意對象。三是基於對象的垃圾內存回收再利用。減少了對象創建析構的開銷。四是各種高性能多功能鎖的出現,類似facebook folly 的設計,將性能提升不少,高衝突時並發性能提高數倍,功能特多,各公司都有自研的東東。五是微線程的跨線程調度,最高已實現每秒1500萬次調度能力,可實現一些特殊情況下微線程的跨線程執行。。。。。。總之,很多進步。
要說的話,伺服器近年肯定還是有一些新技術的,值得探討一下。
1、先問是不是,再問為什麼
多年以前MMO-RPG(比如《魔獸世界》)對娛樂行業的衝擊不亞於VR目前的勢頭,其實VR的真正衝擊還沒到來,不過已經有點山雨欲來風滿樓的意思了。我們所看到的某個技術突然「開了掛」似的飛速發展,一定有台前、幕後兩個因素。台前的因素往往是發現了一個新的龐大市場,幕後的因素是基本技術慢慢積累到一定程度,互相組合以後產生了爆髮式增長。
先看遊戲行業,從目前MMO發展陷入頹勢而MOBA之類的遊戲異軍突起的現狀,能看到伺服器端對技術進步的需求沒有那麼迫切,之前MMO方面積累的技術老本,在更簡單的遊戲類型中還能吃很久。一旦外部壓力小了,技術的發展就進入了內化階段,人們的精力會集中在整理、化簡方面,然後進一步提高開發的便捷程度,而性能指標就不是第一位的了。換句話說,如果犧牲一點性能可以少僱傭幾個高薪程序員,還能減少BUG,不是美滋滋?
再看廣泛的IT行業,也就是更廣泛更通用的伺服器技術部分。看看阿里雲提供的產品就知道了,我就不說了,說多了像廣告。╮(╯▽╰)╭
將技術簡單劃分為「伺服器」和「客戶端」會引起認知偏差,把IT產品劃分為「客戶端」和「伺服器」兩部分,僅僅是一種方便管理和協作的劃分方式。實際上二者完全不對等。對娛樂產品(包含遊戲)來說,「客戶端」的比重一定超過了80%,因為美術工作、設計工作、測試體驗等等絕大多數產品的研發工作,都是以用戶體驗和外部表現為核心來做的,伺服器大多時候是以實現功能為主。簡而言之伺服器程序只是廣義的業務邏輯的一部分而已。
所以伺服器的痛點還是在業務邏輯上,並不需要像VR那樣的必須要革新的壓力……這點和技術關係不大,是歷史發展、市場需求決定的。
下面還是探討一下最近的「新」技術。
2、關於協程
前面有某些答主提到了「協程」,確實協程的廣泛應用可以認為是近幾年值得一提的技術之一。印象中協程是一個非常古老的技術了,我也查了查資料。下面有PDF論文截圖和難得的文字版原文:
計算機語言協程的歷史、現在和未來
可以看到,協程技術大約是在40多年前就有成熟的應用了,只不過編程語言之間固有的障礙性(或者說知識壁壘)導致我們的認識總是在反反覆復中徘徊,可能幾十年前已經解決過的問題,今天我們還要回頭再當成新思想、再理解一遍。
很多遊戲程序員注意到協程這個概念,可能是Lua的Coroutine,剛接觸的時候肯定是一臉懵逼的狀態,感覺可能很好用但又不知怎麼用。很難得Lua的Coroutine是一種完整的協程實現,對比來說,Python2.x本身只有迭代器沒有真的協程,好在可以用greenlet庫來實現協程;C#語言本身也只有迭代器沒有協程,Unity為遊戲邏輯專門設計了「協程」的機制,在遊戲中用起來很好用,但實際和真正的Coroutine又是兩碼事了。
人們對事物的認知總是反反覆復的,現在這些有效的技術被引起重視,為未來在某個方面的爆發積蓄力量。
4、多核CPU與Erlang、Go、Skynet
前文說了,伺服器問題本質只是業務邏輯的一部分而已,產品和技術要解決的都是些具體的不能再具體的小問題,壓力導致進步。多核CPU的廣泛應用其實多年前就已經開始了,多核CPU和Web伺服器的匹配性簡直是完美,無論Apache或者Nginx還是資料庫,都能很好的利用多核。
唯獨到了遊戲這裡,多核成了個大問題。不管對伺服器還是客戶端來說都是至關重要的一個問題。現在Actor模型的陣勢已經起來了,在知乎上搜索,能搜到不少相關問題。
這裡又得談歷史,其實做BigWorld引擎的公司成立於2002年,這時基於Actor模型的可分散式伺服器框架BigWorld可以說是已經成型了。現代分散式邏輯框架都多少受到Erlang的影響,搜搜Erlang的歷史:
Erlang語言的歷史及發展
在20世紀80年代中期,愛立信的計算機科學實驗室接到一個任務:調查適合下一代電信產品的編程
語言。在Joe Armstrong、Robert Virding和Mike Williams在Bjarne D?cker的帶領下,他們
花了兩年時間用原型法測試了所有可能的編程語言。最終的結論是,雖然現有語言也有一些有趣的
和相關的功能,但是沒有一門獨立的語言能夠包容電信行業所需要的所有的特性。因此,他們決定
自己開發一種全新的語言。從此Erlang誕生了,它受到了函數語言(比如ML和Miranda),並發語
言(比如ADA、Modula、Chill)以及邏輯編程語言Prolog語言的啟發和影響。與愛立信專有語言
EriPascal和PLEX一樣,Smalltalk語言的軟體升級特性在Erlang中也得到了深刻的體現。
又一下穿越回到80年代,歷史總是在重複自己。往好的方向看,歷史是在螺旋上升的~~
現在,我們有了完全重新設計的Go語言,理論上可以寫出更好的並髮式程序了(事實上據我觀察大部分Go語言的goroutine還是有濫用的現象,並沒有體現並發的精髓)。最後再推薦一下Skynet,對做框架的朋友來說,學習它會非常非常有收穫。
5、關於其他技術的吐槽
1、BBR。這個不錯,我的V_P_S裝了BBR之後,竟然從幾乎下載不動到了狂飆幾百K的程度,提升幅度無法計算,不過最好把這個技術當作「修正了TCP實現中多年以來的BUG」 (如果SS沒這麼火爆可能這個BUG還得過幾年才能改掉,哈哈)
2、Docker。虛擬化技術的進一步發展,這個對運維和部署來說意義重大。但是猜測在歷史長河中難以作數。
3、超大規模機器學習平台。未來的趨勢,AI在此基礎上會崛起,但是和狹義的「伺服器技術」關係不大,除非把挖礦也算作是伺服器技術。
6、總結
說的有點雜,簡單來說,可以預測Actor模型的重新理解和運用,反而算是「近幾年伺服器技術的巨大進步」,在歷史的發展中會佔有一席之地吧。其他技術都以平常心對待即可~~
請打開「阿里雲點炕」「騰訊雲點炕」左上角的「產品」菜單,看看服務端的進展
技術上主要是架構模式改變了,相比過去了一個整體,現在更傾向於微服務,相比過去實現語言的選擇上,現在多了很多更輕量的選擇,Golang,Node.js,Python and so on
「從10年到現在」
那時候伺服器還得自己攢然後開車拉到機房上架,現在直接買阿里雲
那時候要陪個環境要半天,現在docker pull
嗯,打算讓java進入這個領域,確切滴說就是vert.x
因為其他答案說的actor model,非同步,協程這些,vert.x裡面都有
不僅僅有,而且幾乎就是這一套的實現
所以在遊戲服上使用vert.x是有足夠理論基礎滴
erlang,go等給vert.x做足了榜樣
Server Side Rendering 。(? _ ?)
僅就遊戲伺服器開發相關技術談一些看法
先說一下個人感受:伺服器端近年來的進步幅度比客戶端進步幅度更大更顯著。
- go,nodejs這些新型工具的出現,改變了以往大部分伺服器代碼需要使用C++進行開發的狀態,這兩個工具的跨平台性和完整的代碼庫,給遊戲伺服器開發者帶來了極大的便利,開發者們可以使用喜歡的工具(vscode,vs)在喜歡的平台(windows,mac)開發,調試跨平台的代碼。
- 微服務的理念不斷得到推廣,越來越多的遊戲伺服器採用微服務架構,擴展更加方便。
- 越來越多的技術人員採用docker/k8s等方式進行遊戲伺服器的部署。
- 資料庫不再是清一色的mysql,更多的團隊在開發中使用redis,mongodb等資料庫。
nio,微服務,restful有些是以前就有的東西通過改良換髮青春,比如微服務。
好問題哥也來答一發證明參與,說點我用的。http2協議,好像還沒人提。纖程,原java就有個庫實現,最近阿里在jvm級別實現了,不用改上層代碼。docker,devops必備,我還沒玩轉……
擺在檯面上的東西,我們一個一個看見他在冒出來,而在後端潛移默化改變的東西,我們卻沒有發現的眼光吧.
微服務成為趨勢,為了用自己喜歡的語言寫程序需要靠忽悠克服的阻力越來越少了。
雲服務越來越發達,小公司後端程序員工作中運維部分越來越輕鬆了。
或真或假的前後端分離越來越容易成為首選方案,前後端程序員花在扯皮上的時間少了很多,可以摸更多的魚。
serverless, serverless 是對microservice 最強大的支撐
推薦閱讀:
※做一個APP要多少錢?
※程序員們在寫自己用的小程序的時候會考慮設計模式,編程規範等什麼嗎?還是夠用就好呢?
※程序員應該掌握哪些語言?
※為什麼很多公司做c++不用智能指針,也不自己封裝一個好用的?
※完全沒接觸過編程怎樣自學編程?