近幾年有服務端有哪些新技術?

從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 。(? _ ?)


僅就遊戲伺服器開發相關技術談一些看法

先說一下個人感受:伺服器端近年來的進步幅度比客戶端進步幅度更大更顯著。

  1. go,nodejs這些新型工具的出現,改變了以往大部分伺服器代碼需要使用C++進行開發的狀態,這兩個工具的跨平台性和完整的代碼庫,給遊戲伺服器開發者帶來了極大的便利,開發者們可以使用喜歡的工具(vscode,vs)在喜歡的平台(windows,mac)開發,調試跨平台的代碼。
  2. 微服務的理念不斷得到推廣,越來越多的遊戲伺服器採用微服務架構,擴展更加方便。
  3. 越來越多的技術人員採用docker/k8s等方式進行遊戲伺服器的部署。
  4. 資料庫不再是清一色的mysql,更多的團隊在開發中使用redis,mongodb等資料庫。


nio,微服務,restful有些是以前就有的東西通過改良換髮青春,比如微服務。


好問題哥也來答一發證明參與,說點我用的。

http2協議,好像還沒人提。

纖程,原java就有個庫實現,最近阿里在jvm級別實現了,不用改上層代碼。

docker,devops必備,我還沒玩轉……


擺在檯面上的東西,我們一個一個看見他在冒出來,而在後端潛移默化改變的東西,我們卻沒有發現的眼光吧.


微服務成為趨勢,為了用自己喜歡的語言寫程序需要靠忽悠克服的阻力越來越少了。

雲服務越來越發達,小公司後端程序員工作中運維部分越來越輕鬆了。

或真或假的前後端分離越來越容易成為首選方案,前後端程序員花在扯皮上的時間少了很多,可以摸更多的魚。


serverless, serverless 是對microservice 最強大的支撐


推薦閱讀:

做一個APP要多少錢?
程序員們在寫自己用的小程序的時候會考慮設計模式,編程規範等什麼嗎?還是夠用就好呢?
程序員應該掌握哪些語言?
為什麼很多公司做c++不用智能指針,也不自己封裝一個好用的?
完全沒接觸過編程怎樣自學編程?

TAG:軟體開發 | 服務端開發 | 遊戲服務端 |