Rumah > Artikel > pembangunan bahagian belakang > Permintaan perkhidmatan mikro cuba semula dan fungsi pemprosesan tamat masa dilaksanakan dalam bahasa Go
Permintaan perkhidmatan mikro cuba semula dan fungsi pemprosesan tamat masa dilaksanakan dalam bahasa Go
Dalam sistem teragih moden, seni bina perkhidmatan mikro telah menjadi corak seni bina yang sangat popular. Komunikasi antara perkhidmatan mikro selalunya diselesaikan melalui permintaan rangkaian Walau bagaimanapun, permintaan rangkaian sering disertai dengan masalah yang tidak dapat dielakkan, seperti kelewatan rangkaian, kegagalan perkhidmatan, dll. Untuk meningkatkan ketersediaan dan kebolehpercayaan sistem, kami biasanya perlu memperkenalkan mekanisme percubaan semula dan tamat masa ke dalam permintaan rangkaian antara perkhidmatan mikro.
Artikel ini akan memperkenalkan cara menggunakan bahasa Go untuk melaksanakan fungsi pemprosesan percubaan semula dan tamat masa permintaan perkhidmatan mikro. Kami akan menerangkan terutamanya dua topik berikut:
Minta mekanisme cuba semula
Dalam menghadapi kegagalan permintaan rangkaian, mekanisme cuba semula ialah kaedah biasa untuk Meningkatkan kadar kejayaan permintaan . Apabila permintaan gagal, kita boleh memilih untuk mencuba semula permintaan itu beberapa kali sehingga permintaan itu berjaya atau bilangan maksimum percubaan semula dicapai.
Berikut ialah kod sampel untuk mekanisme percubaan semula permintaan ringkas yang dilaksanakan dalam bahasa Go:
package main import ( "fmt" "net/http" "time" ) const MaxRetries = 3 const RetryInterval = time.Second func makeRequest(url string) (*http.Response, error) { var resp *http.Response var err error for i := 0; i < MaxRetries; i++ { resp, err = http.Get(url) if err == nil { break } fmt.Printf("Request failed. Retrying in %s ", RetryInterval) time.Sleep(RetryInterval) } return resp, err } func main() { resp, err := makeRequest("https://api.example.com") if err != nil { fmt.Println("Failed to make request:", err) return } defer resp.Body.Close() fmt.Println("Request successful") }
Dalam kod di atas, kami mentakrifkan dua MaxRetries
dan RetryInterval
Dua pemalar, masing-masing mewakili bilangan maksimum percubaan semula dan selang masa antara setiap percubaan semula. Fungsi makeRequest
cuba mendapatkan respons untuk URL yang ditentukan dengan menghantar permintaan HTTP GET. Jika permintaan gagal, ia dicuba semula pada bilangan kali yang ditentukan sehingga ia berjaya atau bilangan maksimum percubaan semula dicapai. MaxRetries
和 RetryInterval
两个常量,分别表示最大的重试次数和每次重试之间的时间间隔。makeRequest
函数尝试通过发送HTTP GET请求来获取指定URL的响应。如果请求失败,则进行指定次数的重试,直到成功或达到最大重试次数为止。
请求超时处理
除了请求重试之外,我们还需要为每个请求设置一个合理的超时时间。如果一个请求在指定的超时时间内没有得到响应,我们应该主动放弃该请求,避免对资源的浪费。
Go语言提供了方便的上下文(context)机制来处理请求的超时。我们可以使用 context.WithTimeout
函数来创建一个带有超时的上下文,然后将该上下文传递给网络请求相关的函数,使其在超时之后自动取消,从而实现请求的超时处理。
下面是使用上下文来实现请求超时处理的示例代码:
package main import ( "context" "fmt" "net/http" "time" ) const RequestTimeout = 5 * time.Second func makeRequest(url string) (*http.Response, error) { ctx, cancel := context.WithTimeout(context.Background(), RequestTimeout) defer cancel() req, err := http.NewRequest("GET", url, nil) if err != nil { return nil, err } req = req.WithContext(ctx) client := &http.Client{} resp, err := client.Do(req) if err != nil { return nil, err } return resp, nil } func main() { resp, err := makeRequest("https://api.example.com") if err != nil { fmt.Println("Failed to make request:", err) return } defer resp.Body.Close() fmt.Println("Request successful") }
在上面的代码中,我们使用 context.WithTimeout
函数创建了一个超时为5秒的上下文 ctx
,并将其传递给 http.NewRequest
函数来创建一个请求。接着,我们通过调用 req.WithContext(ctx)
将上下文绑定到请求中。最后,我们创建了一个客户端 client
context.WithTimeout
untuk mencipta konteks dengan tamat masa, dan kemudian menghantar konteks kepada fungsi berkaitan permintaan rangkaian untuk membatalkannya secara automatik selepas tamat masa, dengan itu merealisasikan pemprosesan tamat masa permintaan. 🎜🎜Berikut ialah contoh kod yang menggunakan konteks untuk melaksanakan pengendalian tamat masa permintaan: 🎜rrreee🎜Dalam kod di atas, kami menggunakan fungsi context.WithTimeout
untuk mencipta konteks ctx dengan tamat masa selama 5 saat
dan hantar ke fungsi http.NewRequest
untuk membuat permintaan. Seterusnya, kami mengikat konteks pada permintaan dengan memanggil req.WithContext(ctx)
. Akhir sekali, kami mencipta client
dan menghantar permintaan tersebut Jika kami tidak mendapat respons dalam tempoh tamat masa, permintaan itu akan dibatalkan secara automatik. 🎜🎜Ringkasan🎜🎜Dengan menggunakan mekanisme coroutine dan konteks yang berkuasa yang disediakan oleh bahasa Go, kami boleh melaksanakan fungsi pemprosesan percubaan semula dan tamat masa permintaan perkhidmatan mikro dengan mudah. Dalam pembangunan sistem sebenar, kami boleh mengoptimumkan dan melaraskan berdasarkan keadaan tertentu, seperti melaraskan strategi selang percubaan semula semasa proses percubaan semula, atau melaraskan tamat masa secara dinamik berdasarkan beban dan kestabilan perkhidmatan. Pada masa yang sama, kita juga mesti memberi perhatian kepada pengendalian ralat dengan sewajarnya apabila melakukan percubaan semula permintaan dan pemprosesan tamat masa untuk mengelak daripada menyebabkan masalah yang lebih serius kepada sistem. 🎜Atas ialah kandungan terperinci Permintaan perkhidmatan mikro cuba semula dan fungsi pemprosesan tamat masa dilaksanakan dalam bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!