iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0

對於大部分應用,儘可能快地響應請求是首要任務。例如,應用程序可能正在服務用戶的HTTP請求,或者檢索複製的數據塊。在這些情況下,你需要做出權衡:
是將請求複製到多個處理程序(無論是goutoutine,進程還是伺服器),並且其中一個將比其他處理程序返回更快嗎?還是立即返回結果——缺點是必須考慮如何高效利用資源來保持處理程序的多個副本同時運行?
如果這種複製是在記憶體中完成的,它耗費的資源可能並不是那麼昂貴,但如果處理程序需要複製進程,伺服器甚至數據中心,這就完全不一樣了。你必須考慮這樣做成本是否值得。
我們來看看如何在單個進程中複製請求。我們將使用多個goroutines作為請求處理程序,並且goroutine將在1到6納秒之間隨機休眠一段時間以模擬負載。這將使處理程序在不同時間返回結果,並讓我們看到這樣做能否更高效。
下面這個例子通過10個處理程序複製模擬請求:

doWork := func(done <-chan interface{}, id int, wg *sync.WaitGroup, result chan<- int) {
    started := time.Now()
    defer wg.Done()
    // 模擬隨機加載
    simulatedLoadTime := time.Duration(1+rand.Intn(5)) * time.Second
    select {
    case <-done:
    case <-time.After(simulatedLoadTime):
    }
    select {
    case <-done:
    case result <- id:
    }
    took := time.Since(started) // 顯示處理程序將花費多長時間
    if took < simulatedLoadTime {
        took = simulatedLoadTime
    }
    fmt.Printf("%v took %v\n", id, took)
}

done := make(chan interface{})
result := make(chan int)
var wg sync.WaitGroup
wg.Add(10)

// 請求並發複製處理
for i := 0; i < 10; i++ { 
    go doWork(done, i, &wg, result)
}
firstReturned := <-result 
close(done)               
wg.Wait()
fmt.Printf("Received an answer from #%v\n", firstReturned)

請求並發複製處理:

  1. 我們開啟10個處理程序以處理請求。
  2. 抓取處理程序第一個返回的值。
  3. 取消所有剩餘的處理程序。這確保他們不會繼續做不必要的工作。
    這會輸出:
4 took 1s
3 took 1s
6 took 2s
8 took 1s
2 took 2s
0 took 2s
7 took 4s
5 took 5s
1 took 3s
9 took 3s
Received an answer from #3

在輸出中,我們顯示每個處理程序花費了多久,以便你了解此技術可以節省多少時間。
唯一需要注意的是,所有的處理程序都需要有相同且平等的請求。換句話說,不會出現從無法處理請求的處理程序接收響應時間。正如我所提到的那樣,所有處理者用來完成工作的資源都需要複製。
如果你的處理程序太相似了,那麼任何一個出現異常的機率都會更小。你只應該將這樣的請求複製到具有不同運行時條件的處理程序:不同的進程,計算機,數據存儲路徑或完全訪問不同的數據存儲區。
這樣做的代價可能是昂貴且難以維護。如果速度是你的目標,那這個技術就很有價值了。當然你還需要考慮容錯和可擴展性。

重點摘要:

  1. 對於多數應用來說, 快速響應請求是首要目標。
  2. 可以通過多個處理程序複製請求以達到快速響應,但必須考慮資源的有效使用。
  3. 當處理程序需要複製到不同的進程、伺服器或數據中心時, 資源的消耗和成本會變大。
  4. 透過goroutines模擬負載可以看到請求複製在單個進程中的效果。
  5. 當使用此技術時,需要確保所有處理程序有相同的請求,且所有資源都需複製。
  6. 請求複製應針對具有不同運行條件的處理程序。
  7. 雖然此技術可能昂貴和難以維護,但如果追求速度,則它非常有價值。同時需要考慮容錯和可擴展性。

上一篇
25.Heartbeat
下一篇
27.Rate limiting-1
系列文
Concurrency in go 讀書心得30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言