9.4.9.1 توضیحات #
شما از الگو Retry Timeout برای تلاش مجدد یکسری عملیات استفاده کنید. برای اینکار شما می توانید از حلقه و تابع After در پکیج time کمک بگیرید و برای هرتلاش یک timeout مشخص کنید.
9.4.9.2 دیاگرام #
9.4.9.3 نمونه کد #
1package main
2
3import (
4 "fmt"
5 "net/http"
6 "time"
7)
8
9func main() {
10 var resp *http.Response
11 var err error
12 timeout := time.Duration(3 * time.Second)
13 for i := 0; i < 3; i++ {
14 resp, err = http.Get("http://example.com")
15 if err == nil {
16 break
17 }
18 fmt.Println("Retrying...")
19 <-time.After(timeout)
20 }
21 if err != nil {
22 fmt.Println("Error:", err)
23 } else {
24 fmt.Println("Response:", resp)
25 }
26}
1$ go run main.go
2Retrying...
3Retrying...
4Retrying...
5Error: Get "http://example.com": dial tcp: lookup example.com on 169.254.169.254:53: dial udp 169.254.169.254:53: connect: no route to host
در کد فوق ما داخل حلقه عملیات گرفتن اطلاعات با استفاده از http.Get را قرار دادیم و اگر درخواست با خطا مواجه می شد مجدد تلاش می کردیم که در ادامه کد داخل حلقه از تابع After استفاده کردیم تا سیگنال timeout را بواسطه کانال دریافت کنیم و تلاش مجدد صورت گیرد.
9.4.9.4 کاربردها #
- الگوی Retry Timeout معمولاً در شرایطی استفاده میشود که درخواست شبکه یا نوع دیگری از عملیات ممکن است به دلیل مشکلات موقتی مانند سرور مشغول یا نقص شبکه با شکست مواجه شود. با امتحان مجدد عملیات با فاصله زمانی بین تلاش ها، برنامه می تواند شانس نتیجه موفقیت آمیز را افزایش دهد.