GoDasturchi
Watching for Changes

Watching for Changes

O'zgarishlarni kuzatish

Yangiliklar sahifasini har daqiqada QO'LDA yangilab, "yangi xabar bormi?" deb tekshirish o'rniga, siz obuna bo'lasiz — va yangi xabar chiqishi bilan sizga BILDIRISHNOMA keladi. Kubernetes'da ham controller'lar klasterni har soniyada QAYTA-QAYTA so'rash ("polling") o'rniga, o'zgarishlarga obuna bo'ladi ("watch") — Pod yaratilganda, o'zgarganda yoki o'chirilganda, ularga DARHOL xabar (event) keladi.

example.go
package main

import "fmt"

type Event struct {
	Type string // "Added", "Modified", "Deleted"
	Pod  string
}

type Watcher struct {
	events chan Event
}

func NewWatcher() *Watcher {
	return &Watcher{events: make(chan Event, 10)}
}

func (w *Watcher) Emit(e Event) {
	w.events <- e
}

func (w *Watcher) Close() {
	close(w.events)
}

func main() {
	w := NewWatcher()

	go func() {
		w.Emit(Event{Type: "Added", Pod: "web-1"})
		w.Emit(Event{Type: "Added", Pod: "web-2"})
		w.Emit(Event{Type: "Deleted", Pod: "web-1"})
		w.Close()
	}()

	for e := range w.events {
		fmt.Println(e.Type, e.Pod)
	}
}

"Log Aggregator" loyihasida ko'rgan pub-sub naqshining o'zi: Watcher ichidagi events kanali orqali, BITTA "yozuvchi" (bu yerda — goroutine ichidagi Emit chaqiruvlari) va BITTA "o'quvchi" (maindagi range) BOG'LANADI. for e := range w.events — kanal Close() qilingunga qadar, HAR bir yangi event kelishi bilan uni QABUL qiladi va sikl davom etadi.

Diqqat: bu yerda FAQAT bitta goroutine events kanaliga yozadi, shuning uchun natija HAR doim BIR XIL, deterministik tartibda keladi (kanal — FIFO, "birinchi kirgan, birinchi chiqadi"). Real Kubernetes'da bu mexanizm informer deb ataladi: har bir controller, butun klasterni qayta-qayta so'rash o'rniga, faqat O'ZIGA KERAKLI resurs turidagi (masalan, faqat Pod'lar) o'zgarishlarga obuna bo'lib, samarali ishlaydi.

>_ Exercise

Bir nechta event'ni birdaniga yuborish imkonini qo'shing.

  • EmitAll(events []Event) metodini yozing: slice bo'ylab yurib, har birini Emit qiling
  • Uchta event'dan iborat slice yarating va uni goroutine ichida EmitAll orqali yuboring, so'ng Close qiling
  • main'da range orqali barcha event'larni chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Watch (kuzatish) naqshi — resursni qayta-qayta so'rash (polling) o'rniga, o'zgarish YUZ berganda darhol xabar (event) olish imkonini beradi; Go'da bu kanal orqali BITTA yozuvchi, BITTA o'quvchi bilan tabiiy, deterministik tarzda amalga oshiriladi.

NEXT UP

ConfigMaps & Secrets

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Watching for Changes

O'zgarishlarni kuzatish

Yangiliklar sahifasini har daqiqada QO'LDA yangilab, "yangi xabar bormi?" deb tekshirish o'rniga, siz obuna bo'lasiz — va yangi xabar chiqishi bilan sizga BILDIRISHNOMA keladi. Kubernetes'da ham controller'lar klasterni har soniyada QAYTA-QAYTA so'rash ("polling") o'rniga, o'zgarishlarga obuna bo'ladi ("watch") — Pod yaratilganda, o'zgarganda yoki o'chirilganda, ularga DARHOL xabar (event) keladi.

example.go
package main

import "fmt"

type Event struct {
	Type string // "Added", "Modified", "Deleted"
	Pod  string
}

type Watcher struct {
	events chan Event
}

func NewWatcher() *Watcher {
	return &Watcher{events: make(chan Event, 10)}
}

func (w *Watcher) Emit(e Event) {
	w.events <- e
}

func (w *Watcher) Close() {
	close(w.events)
}

func main() {
	w := NewWatcher()

	go func() {
		w.Emit(Event{Type: "Added", Pod: "web-1"})
		w.Emit(Event{Type: "Added", Pod: "web-2"})
		w.Emit(Event{Type: "Deleted", Pod: "web-1"})
		w.Close()
	}()

	for e := range w.events {
		fmt.Println(e.Type, e.Pod)
	}
}

"Log Aggregator" loyihasida ko'rgan pub-sub naqshining o'zi: Watcher ichidagi events kanali orqali, BITTA "yozuvchi" (bu yerda — goroutine ichidagi Emit chaqiruvlari) va BITTA "o'quvchi" (maindagi range) BOG'LANADI. for e := range w.events — kanal Close() qilingunga qadar, HAR bir yangi event kelishi bilan uni QABUL qiladi va sikl davom etadi.

Diqqat: bu yerda FAQAT bitta goroutine events kanaliga yozadi, shuning uchun natija HAR doim BIR XIL, deterministik tartibda keladi (kanal — FIFO, "birinchi kirgan, birinchi chiqadi"). Real Kubernetes'da bu mexanizm informer deb ataladi: har bir controller, butun klasterni qayta-qayta so'rash o'rniga, faqat O'ZIGA KERAKLI resurs turidagi (masalan, faqat Pod'lar) o'zgarishlarga obuna bo'lib, samarali ishlaydi.

>_ Exercise

Bir nechta event'ni birdaniga yuborish imkonini qo'shing.

  • EmitAll(events []Event) metodini yozing: slice bo'ylab yurib, har birini Emit qiling
  • Uchta event'dan iborat slice yarating va uni goroutine ichida EmitAll orqali yuboring, so'ng Close qiling
  • main'da range orqali barcha event'larni chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Watch (kuzatish) naqshi — resursni qayta-qayta so'rash (polling) o'rniga, o'zgarish YUZ berganda darhol xabar (event) olish imkonini beradi; Go'da bu kanal orqali BITTA yozuvchi, BITTA o'quvchi bilan tabiiy, deterministik tarzda amalga oshiriladi.

NEXT UP

ConfigMaps & Secrets