【程式語言 - Go】Retry Policy

閱讀時間約 4 分鐘
Golang,也稱作Go,是一種開源的編程語言,由Google開發。Golang設計的目標是提供一種簡單、高效、可靠的語言,適用於現代軟體開發的需求。
但由於Golang並沒有以完全物件導向的模式進行開發,因此在使用上會與我們熟悉的Javascript/Typescript有點不同,而這次要介紹的是Go語言如何設計一個泛用的Retry函式,以應付複雜的網路環境之下需要進行Retry的需求。
我們開發程式的過程中難免會依賴DB或其他服務, 但複雜的網路環境下我們並沒有辦法確保我們發送的請求是否正確的送達, 因此我們可以在程式中加入Retry機制, 提升我們軟體的強健性。
尤其是面對NoSQL相對弱一致性的DB時更需注意, 而在Go語言, 我們可以用簡單的技巧來完成Retry的策略, 在進行Retry時, 我們可能會需要兩個參數:
  1. retryPeriod: 每一次重試的等待時間。
  2. maxRetryCount: 最大重試次數。
為什麼要以上兩個參數?
既然已經寫入失敗了, 那麼在短時間內不斷的重試也是徒勞, 因此我們可以等待一段時間後再嘗試請求, 減少非必要的動作。
以下的程式碼除了會帶入Retry參數之外, 也帶入了job, 而這個job function我們規範會回傳error, 我們會偵測這個job的error, 當error發生時就進行Retry的循環, 並等待一段時間後再執行job, 那過程中假設Retry的次數已經超過我們期望的最大次數時, 就會回傳error, 此時在呼叫retry的地方就能針對error進行處理。
接著會以MongoDB寫入為例, 來示範怎麼使用上面設計的retry function。
func retry(maxRetryCount int, retryPeriod int, job func() error) error {
for retryCount := 1; ; retryCount++ {
err := job()
if err == nil {
return nil
}
// 進入retry模式
if retryCount <= maxRetryCount {
glog.Errorf("error: %s, retry: %d, max: %d, wait: %ds", err, retryCount, maxRetryCount, retryPeriod)
time.Sleep(time.Second * time.Duration(retryPeriod))
} else {
return err
}
}
}
func Update(id string, update bson.M, timeout time.Duration, opts ...*options.FindOneAndUpdateOptions) (*mongo.SingleResult, error) {
var result *mongo.SingleResult
if err := b.retry(func() error {
objID, err := primitive.ObjectIDFromHex(id)
if err != nil {
return err
}
filter := bson.M{
"_id": objID,
}
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
returnDocument := options.After
defaultOpts := &options.FindOneAndUpdateOptions{
ReturnDocument: &returnDocument,
}
opts = append(opts, defaultOpts)
result = b.Collection.FindOneAndUpdate(ctx, filter, update, opts...)
if err := result.Err(); err != nil {
return err
}
return nil
}); err != nil {
glog.Fatal("retry失敗, 請進行後續處理")
}
return result, nil
}
為什麼會看到廣告
95會員
234內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
程式語言:旅途啟程在一次五天的年假中,我決定開始學習Python編程。雖然最初進展順利,但後來發現自己在解題和邏輯方面遇到了困難。經過思考後,我決定轉而學習C/C++,並且制定了一個計畫,希望成為一名後端工程師。這將需要挑戰我的時間管理能力。
avatar
林昱廷
2024-06-04
[程式語言] DataCamp 使用心得與費用公開 學習Python數據分析 文末附上2024 50% off 折扣連結網路上自學程式語言的網站百百種有Coursera、Udemy、Youtube的免費資源等等。程式小白要怎麼從眾多資源中選擇最適合自己的學習平台,而我又為什麼選擇DataCamp為Python自學平台呢?原因可以分為以下幾點: DataCamp的系統性課程選擇: 有提供兩種有系統且直接能達到你
avatar
Hsinyin Chang
2024-05-26
程式語言的三個基本特性關於程式語言的學習,只要掌握住幾個基本特性要熟悉幾種程式語言也不困難,這三個基本特性就是…
Thumbnail
avatar
Warren Lo
2024-02-27
TQC+程式語言Python3考照必勝專題~全部目錄(上下集)目錄 (功能:小叮噹的任意門,點入連結,會直接到那一題)
Thumbnail
avatar
pc000
2023-08-23
Tornado的程式語言應受言論自由的保障!先前大家為了數位中介服務法草案是否會箝制言論自由吵翻天,網路言論自由當然也是存在於Web3.0世界與幣圈,放眼現今與未來的Web3.0世界與幣圈,主要的生態系與應用大多在以太坊的智能合約與代幣經濟,而智能合約與代幣都是由程式語言所撰寫建構。但最近幣圈也出現言論自由遭到迫害的案例,也就是撰擬Torna
Thumbnail
avatar
建佑律師_NoMoreLaw
2022-09-19
【入門自學程式語言必看】如何面對自學遇到的挫折?【因為擔心失敗而焦慮】 在自學程式的路上大家都會感到焦慮,學習不順的時候,是不是會擔心最後我的目標失敗了,別人會怎麼看我?或擔心自己其實沒天分?甚至質疑自己的目標規劃?我在零基礎開始自學程式做出線上服務的過程中,心裡也常常出現這樣的聲音,所以想分享給大家我怎麼突破的,初學者該如何面對自學的挫折呢
Thumbnail
avatar
Benson老師教你程式學習技巧
2022-07-25
【入門自學程式語言必看】如何設定目標?【為何而學?】 相信剛入門自學程式的人都會遇到許多困難,可能教學資源太多無從下手,或是學了基礎可是無法自己寫出功能,不過最常見的應該屬目標導向的問題,就是不知道為何而學,我自己也是靠著自學製作了一個幫賣家封鎖電商黑名單的chrome插件賺取被動收入,對於設定目標有一點點心得想分享給大家:
Thumbnail
avatar
Benson老師教你程式學習技巧
2022-07-24
關於學習程式語言這件事...為什麼想學程式語言? 這個問題應該是知道我有在學程式語言的人,馬上脫口而出的問題。 對呀!WHY?一個即將邁向40大關的中年男子(從叔叔→阿伯),為什麼要這麼想不開,突然跳進一堆看不懂...呃...
Thumbnail
avatar
Kyle
2022-01-28
哪個程式語言最流行最好?世界上有最好的程式語言嗎?答案絕對是否定的,每種語言都有適合的使用時機,而也有不少程式語言是隨著時代變遷而消失的。請放下自己要學到最好語言的心態,多看多學,自然會找到適合你的語言。這篇文章會用客觀的角度跟你分享最多人使用的程式語言。
Thumbnail
avatar
工程師布萊克
2021-06-21