雙11背後的技術(上)最後衝刺

 阿里巴巴的主要業務包括在線交易,支付和其他業務,下圖中列出阿里巴巴中採用的一些開源項目。

阿里巴巴基於服務進行開發系統,服務間通過 RPC 進行通訊。要應對高併發,對於阿里的挑戰。

多租戶的看起來是不是有點像微服務,在淘寶的個人推薦上應該多租戶

每一個 java 的線程對應一個native 線程。我們通過control group 來分配線程。

我們彙總一下阿里對

1.Multi-tenant 有關多租戶之前我們已經介紹過。那麼多租戶具體採用那種技術來實現的呢。在每個租戶的線程也是如何分配和隔離的。

多租戶,可以爲每個租戶分配一定內存和CPU資源。G1 是才用分代算法,按年輕代和老年代來劃分內存。G1 的特點是講內存等分爲若干小的區域 region , 包括 Eden survivor old。通過改造我們讓每一個租戶都被分配到一定內存。G1 會安租戶來管理堆內存,進行垃圾回收。所以每一個租戶是獨立的GC。好了,我們看一下每個租戶是如何獲取自己的 CPU 資源。概述一下,每一個 java 線程都會對應到 native 線程。然後用 control group 管理 native 線程來控制如何分配資源給租戶。

2.GCIH :通過 GCIH 劃分出來部分內存,自主管理,這些這部分內存對於 GC 是不可見的。管理堆內存,讓一些內存自主管理對 GC 是不可見的。這樣來實現緩存數據機制。

3.Wisp :專注於異步編程。每一次用戶請求都是,都是一次等待,都是一次線程阻塞。

異步編程是通過線程間切換來實現的,其實線程間交互數據,在底層是一種很費資源的解決方案,因爲線程間的通訊是需要切換上下文,早在 Linux 中就不提倡使用線程池來實現異步編程。阿里採用協程代替線程來進行異步編程。通過協程來做一些阻塞的操作。有關於協程的概念。

如果你有 Python js es6的背景,尤其是你要是有 golang 的經驗就跟不難理解,go 語言是處理高併發的高手,Go語言從語言層面上就支持了併發,這與其他語言大不一樣,不像以前我們要用Thread庫 來新建線程,還要用線程安全的隊列庫來共享數據。強大武器就是  goroutine和channel

。在新貴的 kotlin 中也對協程有良好的支持,協程相對於線程開銷要小的多。java 也是也有自己的併發解決的方案。但是通過線程來解決高併發的問題,不僅是開銷的問題,而且是有瓶頸的,當分配線程達到一定數量,即是再分配更多的線程也不會有明顯的效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章