歡迎光臨
每天分享高質量文章

一周 Go World 新鮮事-2019W08

01

Go記憶體模型&Happen-Before;(一)

 

Go語言的記憶體模型規定了一個goroutine可以看到另外一個goroutine修改同一個變數的值的條件,這類似java記憶體模型中記憶體可見性問題。

當多個goroutine併發同時存取同一個資料時候必須把併發的存取的操作順序化,在go中可以實現操作順序化的工具有高級的通道(channel)通信和同步原語比如sync包中的Mutex(互斥鎖)、RWMutex(讀寫鎖)或者和sync/atomic中的原子操作。

當程式裡面只有一個goroutine時候,雖然編譯器和CPU由於開啟了優化功能可能調整讀寫操作的順序,但是這個調整是不會影響程式的執行正確性:

a := 1//1
b := 2//2
c := a + b //3
...

如上代碼由於編譯器和cpu的優化,實際運行時候可能代碼(2)先運行,然後代碼(1)後執行,但是由於代碼(3)依賴代碼(1)和代碼(2)創建的變數,所以代碼(1)和(2)不會被放到代碼(3)後運行,也就是說編譯器和CPU在不改變程式正確性的前提下才會對指令進行重排序,所以上面代碼在單一goroutine時候並不會存在問題,也就是在單一goroutine 中Happens Before所要表達的順序就是程式執行的順序。

 

原文鏈接:

http://ifeve.com/go-memhappen-before%EF%BC%88%E4%B8%80%EF%BC%89/

原文二維碼:

 

 

02

golang中Context的使用場景

 

context在Go1.7之後就進入標準庫中了。它主要的用處如果用一句話來說,是在於控制goroutine的生命周期。當一個計算任務被goroutine承接了之後,由於某種原因(超時,或者強制退出)我們希望中止這個goroutine的計算任務,那麼就用得到這個Context了。關於Context的四種結構,CancelContext、TimeoutContext、DeadLineContext、ValueContext的使用在這一篇快速掌握 Golang context 包已經說的很明白了。本文主要來盤一盤golang中context的一些使用場景。

 

原文鏈接:

https://mp.weixin.qq.com/s/xbDFN-JhTIQ4xWanEC1Bxw

原文二維碼:

03

golang協程池設計

 

 

go自從出生就身帶“高併發”的標簽,其併發編程就是由groutine實現的,因其消耗資源低,性能高效,開發成本低的特性而被廣泛應用到各種場景,例如服務端開發中使用的HTTP服務,在golang net/http包中,每一個被監聽到的tcp鏈接都是由一個groutine去完成處理其背景關係的,由此使得其擁有極其優秀的併發量吞吐量。

for {
        // 監聽tcp
        rw, e := l.Accept()
        if e != nil {
            .......
        }
        tempDelay = 0
        c := srv.newConn(rw)
        c.setState(c.rwc, StateNew) // before Serve can return
        // 啟動協程處理背景關係
        go c.serve(ctx)
}

雖然創建一個groutine占用的記憶體極小(大約2KB左右,執行緒通常2M左右),但是在實際生產環境無限制的開啟協程顯然是不科學的,比如上圖的邏輯,如果來幾千萬個請求就會開啟幾千萬個groutine,當沒有更多記憶體可用時,go的調度器就會阻塞groutine最終導致記憶體上限溢位乃至嚴重的崩潰,所以本文將通過實現一個簡單的協程池,以及剖析幾個開源的協程池原始碼來探討一下對groutine的併發控制以及多路復用的設計和實現。

 

原文鏈接:

https://segmentfault.com/a/1190000018193161

原文二維碼:

 

04

TiDB 在摩拜單車的深度實踐及應用

摩拜單車 2017 年開始將 TiDB 嘗試應用到實際業務當中,根據業務的不斷發展,TiDB 版本快速迭代,我們將 TiDB 在摩拜單車的使用場景逐漸分為了三個等級:

  • P0 級核心業務:線上核心業務,必須單業務單集群,不允許多個業務共享集群性能,跨 AZ 部署,具有異地災備能力。
  • P1 級在線業務:線上業務,在不影響主流程的前提下,可以允許多個業務共享一套 TiDB 集群
  • 離線業務集群:非線上業務,對實時性要求不高,可以忍受分鐘級別的資料延遲。

本文會選擇三個場景,給大家簡單介紹一下 TiDB 在摩拜單車的使用姿勢、遇到的問題以及解決方案。

 

原文鏈接:

https://mp.weixin.qq.com/s/tXlli0-egrzXiX1__GuMPA

原文二維碼:

 

 

05

k8s 中定時任務的實現

k8s 中有許多優秀的包都可以在平時的開發中借鑒與使用,比如,任務的定時輪詢、高可用的實現、日誌處理、快取使用等都是獨立的包,可以直接取用。本篇文章會介紹 k8s 中定時任務的實現,k8s 中定時任務都是通過 wait 包實現的,wait 包在 k8s 的多個組件中都有用到。

golang 中可以通過 time.Ticker 實現定時任務的執行,但在 k8s 中用了更原生的方式,使用 time.Timer 實現的。time.Ticker 和 time.Timer 的使用區別如下:

  • ticker 只要定義完成,從此刻開始計時,不需要任何其他的操作,每隔固定時間都會自動觸發。
  • timer 定時器是到了固定時間後會執行一次,僅執行一次
  • 如果 timer 定時器要每隔間隔的時間執行,實現 ticker 的效果,使用 func (t *Timer) Reset(d Duration) bool

 

原文鏈接:

https://www.jianshu.com/p/83eb85d53382

原文二維碼:

職位推薦:

【上海】積夢智慧科技招聘Go工程師 

 

來積夢智慧

 Gopher China 創始人共事

接受其親自指導

大牛雲集的辦公環境

花錢也買不到的專業培訓

 

長按圖片識別二維碼瞭解招聘詳情

 

Gopher China 2019 最新資訊

 

 

【重磅】Gopher China 2019 大會講師及議題揭曉

重磅!會前一天培訓講師揭曉:Dave&William;

探探Gopher China 2019大會全面啟動

下周將陸續給大家帶來本次 Gopher China 大會的講師專訪,敬請期待哦~

Gopher China 2019 大會火熱售票中~~

戳下方“ 閱讀原文 ”即可報名

文章已於修改
    閱讀原文

    赞(0)

    分享創造快樂