GoDasturchi
Graceful Shutdown

Graceful Shutdown

Muloyim to'xtash (bulut kontekstida)

"Go Design Patterns" kursida graceful shutdown'ning asosini ko'rgan edingiz. Bulut muhitida (Kubernetes, Docker) bu ayniqsa muhim: orkestratsiya tizimi konteyneringizni istalgan vaqtda (masalan, yangi versiyaga o'tishda, yoki serverni ko'chirishda) to'xtatishi mumkin — va u avval har doim SIGTERM signalini yuboradi, "iltimos, muloyimlik bilan to'xta" deb.

example.go
package main

import (
	"context"
	"fmt"
	"time"
)

// Haqiqiy loyihada: signal.NotifyContext(context.Background(), syscall.SIGTERM)
// bilan OS'ning haqiqiy to'xtatish signalini kutasiz. Bu yerda esa buni
// oddiy kanal orqali simulyatsiya qilamiz.
func waitForShutdown(stop <-chan struct{}) {
	ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond)
	defer cancel()

	select {
	case <-stop:
		fmt.Println("to'xtatish signali qabul qilindi")
	case <-ctx.Done():
		fmt.Println("signal kutish vaqti tugadi")
	}
}

func main() {
	stop := make(chan struct{})
	go func() {
		time.Sleep(10 * time.Millisecond)
		close(stop)
	}()

	waitForShutdown(stop)
	fmt.Println("faol so'rovlar tugashi kutilmoqda...")
	fmt.Println("server to'xtatildi")
}

Haqiqiy production kodida stop kanali o'rniga signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT) ishlatiladi — bu Go'ga "operatsion tizimdan SIGTERM yoki SIGINT (Ctrl+C) kelsa, menga xabar ber" deydi. Bizning interaktiv o'quv muhitimiz haqiqiy OS signalini yubora olmaydi, shuning uchun buni oddiy kanal bilan simulyatsiya qildik — lekin qolgan mantiq (signal kelganda hozirgi ishni tugatib, keyin to'xtash) production kodidagi bilan bir xil.

Kubernetes odatda SIGTERM yuborgandan keyin 30 soniya kutadi ("grace period"), va agar dastur shu vaqt ichida to'xtamasa, majburiy SIGKILL bilan o'ldiradi. Shuning uchun graceful shutdown mantig'ingiz shu vaqt ichida albatta yakunlanishi kerak — "Production Graceful Shutdown" darsida ko'rgan context timeout aynan shu chegarani ta'minlash uchun ishlatiladi.

>_ Exercise

Ikkita bosqichli muloyim to'xtashni yozing: avval yangi so'rovlarni to'xtatish, keyin faollarini kutish.

  • shutdown(stop <-chan struct{}) []string funksiyasini yozing: stop kelguncha kutsin
  • kelgach, ["yangi so'rovlar qabul qilinmayapti", "faol so'rovlar tugallandi", "server to'xtatildi"] ro'yxatini qaytarsin
  • har bir qatorni chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Bulut muhitida graceful shutdown — orkestratsiya tizimi yuborgan to'xtatish signalini qabul qilib, yangi ishni to'xtatib, faol ishni tugatib, so'ng chiqishdan iborat, hammasi belgilangan vaqt chegarasida.

NEXT UP

Health & Readiness Endpoints

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Graceful Shutdown

Muloyim to'xtash (bulut kontekstida)

"Go Design Patterns" kursida graceful shutdown'ning asosini ko'rgan edingiz. Bulut muhitida (Kubernetes, Docker) bu ayniqsa muhim: orkestratsiya tizimi konteyneringizni istalgan vaqtda (masalan, yangi versiyaga o'tishda, yoki serverni ko'chirishda) to'xtatishi mumkin — va u avval har doim SIGTERM signalini yuboradi, "iltimos, muloyimlik bilan to'xta" deb.

example.go
package main

import (
	"context"
	"fmt"
	"time"
)

// Haqiqiy loyihada: signal.NotifyContext(context.Background(), syscall.SIGTERM)
// bilan OS'ning haqiqiy to'xtatish signalini kutasiz. Bu yerda esa buni
// oddiy kanal orqali simulyatsiya qilamiz.
func waitForShutdown(stop <-chan struct{}) {
	ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond)
	defer cancel()

	select {
	case <-stop:
		fmt.Println("to'xtatish signali qabul qilindi")
	case <-ctx.Done():
		fmt.Println("signal kutish vaqti tugadi")
	}
}

func main() {
	stop := make(chan struct{})
	go func() {
		time.Sleep(10 * time.Millisecond)
		close(stop)
	}()

	waitForShutdown(stop)
	fmt.Println("faol so'rovlar tugashi kutilmoqda...")
	fmt.Println("server to'xtatildi")
}

Haqiqiy production kodida stop kanali o'rniga signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT) ishlatiladi — bu Go'ga "operatsion tizimdan SIGTERM yoki SIGINT (Ctrl+C) kelsa, menga xabar ber" deydi. Bizning interaktiv o'quv muhitimiz haqiqiy OS signalini yubora olmaydi, shuning uchun buni oddiy kanal bilan simulyatsiya qildik — lekin qolgan mantiq (signal kelganda hozirgi ishni tugatib, keyin to'xtash) production kodidagi bilan bir xil.

Kubernetes odatda SIGTERM yuborgandan keyin 30 soniya kutadi ("grace period"), va agar dastur shu vaqt ichida to'xtamasa, majburiy SIGKILL bilan o'ldiradi. Shuning uchun graceful shutdown mantig'ingiz shu vaqt ichida albatta yakunlanishi kerak — "Production Graceful Shutdown" darsida ko'rgan context timeout aynan shu chegarani ta'minlash uchun ishlatiladi.

>_ Exercise

Ikkita bosqichli muloyim to'xtashni yozing: avval yangi so'rovlarni to'xtatish, keyin faollarini kutish.

  • shutdown(stop <-chan struct{}) []string funksiyasini yozing: stop kelguncha kutsin
  • kelgach, ["yangi so'rovlar qabul qilinmayapti", "faol so'rovlar tugallandi", "server to'xtatildi"] ro'yxatini qaytarsin
  • har bir qatorni chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Bulut muhitida graceful shutdown — orkestratsiya tizimi yuborgan to'xtatish signalini qabul qilib, yangi ishni to'xtatib, faol ishni tugatib, so'ng chiqishdan iborat, hammasi belgilangan vaqt chegarasida.

NEXT UP

Health & Readiness Endpoints