Perääntyminen ja uudelleenyritys
Yritä uudelleen kasvavalla viiveellä
Perääntyminen ja uudelleenyritys on ilmainen Go Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Go Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Go Academy-kurssilla on yhteensä 4 oppituntia.
Miksi uudelleenyrityksiä tehdään
Väliaikaiset virheet, aikakatkaisut, katkenneet yhteydet ja lyhyet 503-virheet onnistuvat usein toisella yrityksellä. Uudelleenyritys tekee epävakaasta toiminnosta luotettavamman häiritsemättä kutsun tekijää.
Yksinkertainen uudelleenyritys on vaarallinen
Välitön uudelleenyritys tiukassa silmukassa kuormittaa vaikeuksissa olevaa palvelua ja voi aiheuttaa uudelleenyritysten myrskyn. Yritysten väliin tarvitaan viiveitä, joiden tulisi kasvaa vähitellen.
Eksponentiaalinen backoff
Eksponentiaalisessa backoffissa odotusaika kaksinkertaistuu jokaisen epäonnistumisen jälkeen: 100ms, 200ms, 400ms, 800ms. Näin taustalla oleva palvelu saa aikaa palautua.
delay := 100 * time.Millisecond
for attempt := 0; attempt < 5; attempt++ {
// try, on failure:
time.Sleep(delay)
delay *= 2
}Jitterin lisääminen
Jos monet asiakkaat käyttävät backoffia täsmälleen samaan tahtiin, ne yrittävät uudelleen samalla hetkellä ja aiheuttavat palvelulle thundering herd -ilmiön. Jitter satunnaistaa jokaista viivettä hieman, joten uudelleenyritykset jakautuvat eri ajankohtiin.
jitter := time.Duration(rand.Int63n(int64(delay) / 2))
time.Sleep(delay + jitter)Viiveen rajaaminen
Eksponentiaalinen kasvu tekee viiveestä nopeasti hyvin pitkän. Asettakaa viiveelle enimmäisarvo, jotta yritysten välillä ei tarvitse odottaa minuutteja.
if delay > 2*time.Second {
delay = 2 * time.Second
}Yrityskertojen rajoittaminen
Rajoittakaa yritysten määrää aina. Kun enimmäismäärä on saavutettu, palauttakaa viimeisin virhe, jotta kutsun tekijä voi päättää jatkosta sen sijaan, että uudelleenyritys jatkuisi loputtomasti.
Yrittäkää uudelleen vain idempotenttia työtä
Uudelleenyritys on turvallista vain, kun toiminto voidaan suorittaa kahdesti ilman haittaa. GET on idempotentti, mutta korttia veloittavaa ei-idempotenttia POST-pyyntöä ei pidä yrittää uudelleen sokeasti. Käyttäkää tarvittaessa idempotency key -avaimia.
Täydellinen backoff-uudelleenyritys
Tämä ohjelma yrittää uudelleen funktiota, joka epäonnistuu kahdesti ja onnistuu sitten. Viive kaksinkertaistuu joka kerta, ja ohjelma käyttää vain standardikirjastoa.
package main
import (
"errors"
"fmt"
"time"
)
func flaky(attempt int) error {
if attempt < 2 {
return errors.New("temporary failure")
}
return nil
}
func main() {
delay := 50 * time.Millisecond
var err error
for attempt := 0; attempt < 5; attempt++ {
err = flaky(attempt)
if err == nil {
fmt.Println("succeeded on attempt", attempt)
return
}
fmt.Printf("attempt %d failed, waiting %v\n", attempt, delay)
time.Sleep(delay)
delay *= 2
}
fmt.Println("gave up:", err)
}contextin huomioiminen
Välittäkää context uudelleenyrityssilmukkaan ja valitkaa ctx.Done()-kanava nukkuessanne. Näin peruutettu tai aikakatkaistu kutsun tekijä voi lopettaa uudelleenyritykset välittömästi.
select {
case <-ctx.Done():
return ctx.Err()
case <-time.After(delay):
}Virheiden erottelu
Kaikki virheet eivät sovellu uudelleenyritykseen. 400 Bad Request epäonnistuu joka kerta. Tutkikaa virhe tai statuskoodi ja yrittäkää uudelleen vain väliaikaisissa virheluokissa, kuten aikakatkaisuissa, 429-virheissä ja 5xx-virheissä.
Circuit breakerit
Kun virheet jatkuvat, circuit breaker lopettaa pyyntöjen lähettämisen jäähdytysajaksi sen sijaan, että jokaista kutsua yritettäisiin uudelleen. Se täydentää backoffia suojaamalla selvästi toimintakyvytöntä riippuvuutta.
Pikatesti
Testatkaa backoffin tuntemustanne.
Kertaus
Opitte backoffin ja uudelleenyritysten perusteet:
- Eksponentiaalinen backoff kaksinkertaistaa viiveen jokaisen epäonnistumisen jälkeen
- Jitter estää synkronoidut uudelleenyritysten myrskyt
- Rajaa viive ja yrityskertojen määrä
- Yrittäkää uudelleen vain idempotentteja toimintoja tai uudelleenyritykseen soveltuvien virheiden jälkeen
- Huomioikaa context peruutustilanteissa
Opi Go tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 51
- Oppitunnit
- 203
Usein kysytyt kysymykset
Onko oppitunti ”Perääntyminen ja uudelleenyritys” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Go Academy-oppimispolun 3 oppituntia, myös oppitunnin “Perääntyminen ja uudelleenyritys”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Go Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Perääntyminen ja uudelleenyritys”?
Yritä uudelleen kasvavalla viiveellä Harjoittelet Go Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Go Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Go Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.
Kuinka kauan ”Perääntyminen ja uudelleenyritys”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Go Academy-oppitunnilla?
Kyllä. Jokainen Go Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Token bucket -periaate
- golang.org/x/time/rate
- Gorutiinien rajoittaminen
- Perääntyminen ja uudelleenyritys