π§βπ» Go ΠΌΠΎΠΆΠ΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΡΠΏΠ°Π²ΡΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ Ρ ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π·Π°Π΄Π΅ΡΠΆΠΊΠΎΠΉ
π Π Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ Π²Π½Π΅ΡΠ½ΠΈΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ, SSH-ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ API ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Ρ. ΠΠΌΠ΅ΡΡΠΎ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° Ρ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ time.Sleep ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΠ΅ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠ΅ ΠΏΠΎΠΏΡΡΠΊΠΈ Ρ ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π·Π°Π΄Π΅ΡΠΆΠΊΠΎΠΉ ΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌ ΡΠ°Π·Π±ΡΠΎΡΠΎΠΌ β ΡΡΠΎ ΡΠ½ΠΈΠΆΠ°Π΅Ρ Π½Π°Π³ΡΡΠ·ΠΊΡ Π½Π° Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΎΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° Π²ΠΎΡΠΊΠ΅ΡΠΎΠ².
π Π Π΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠ΅ ΠΏΠΎΠΏΡΡΠΊΠΈ Ρ ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π·Π°Π΄Π΅ΡΠΆΠΊΠΎΠΉ:
package main
import (
"context"
"fmt"
"math/rand"
"time"
)
func retry(ctx context.Context, attempts int, task func() error) error {
delay := 500 * time.Millisecond
maxDelay := 15 * time.Second
for i := 0; i < attempts; i++ {
if err := task(); err == nil {
return nil
} else if i == attempts-1 {
return fmt.Errorf("task failed after %d attempts: %w", attempts, err)
}
jitter := time.Duration(rand.Int63n(int64(delay/2 + 1)))
timer := time.NewTimer(delay + jitter)
select {
case <-ctx.Done():
timer.Stop()
return ctx.Err()
case <-timer.C:
}
delay *= 2
if delay > maxDelay {
delay = maxDelay
}
}
return nil
}
func main() {
ctx, cancel := context.WithTimeout(
context.Background(),
60*time.Second,
)
defer cancel()
err := retry(ctx, 6, func() error {
fmt.Println("ΠΡΠΎΠ±ΡΠ΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ...")
return fmt.Errorf("service unavailable")
})
if err != nil {
fmt.Println("ΠΡΠΈΠ±ΠΊΠ°:", err)
}
}
π ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ:
β’ ΠΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠΈΠ°Π»ΡΠ½Π°Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠ° ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΠΏΡΡΠΊΠ°ΠΌΠΈ, Π° Π²Π΅ΡΡ Π½ΠΈΠΉ ΠΏΡΠ΅Π΄Π΅Π» Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΅ΠΌΡ ΡΠ°ΡΡΠΈ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎ.
β’ jitter Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΡΡΡ, ΡΠΌΠ΅Π½ΡΡΠ°Ρ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ².
β’ context.Context ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠ΅ΠΊΡΠ°ΡΠΈΡΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΎΡΠΌΠ΅Π½Π΅ Π·Π°Π΄Π°ΡΠΈ ΠΈΠ»ΠΈ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΎΠ±ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠΌΠ°ΡΡΠ°.
βοΈ Π’Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π΄Π»Ρ CI/CD-Π°Π³Π΅Π½ΡΠΎΠ², ΡΠΎΠ½ΠΎΠ²ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², API-ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ. ΠΠ°ΠΆΠ½ΠΎ ΠΏΠΎΠ²ΡΠΎΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ: Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅ΡΠ΅Π²ΡΠ΅ ΡΠ±ΠΎΠΈ ΠΈ HTTP 503, Π½ΠΎ Π½Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ»ΠΈ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ. ΠΠ»Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Ρ ΠΏΠΎΠ±ΠΎΡΠ½ΡΠΌΠΈ ΡΡΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΈΠ΄Π΅ΠΌΠΏΠΎΡΠ΅Π½ΡΠ½ΠΎΡΡΡ.
tags: #go #Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ #ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°
π§ @recura_tech