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.
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.
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
$ go run main.go
Kodingizni ishga tushiring