GoDasturchi
The Reconciliation Loop Pattern

The Reconciliation Loop Pattern

Reconciliation tsikli naqshi

Termostatni tasavvur qiling: u har soniyada xonaning JORIY haroratini o'lchaydi, buni siz BELGILAGAN haroratga solishtiradi, va farq bo'lsa — isituvchini yoqadi yoki o'chiradi. U hech qachon "tugatmaydi" — bu tsikl DOIMIY davom etadi. "ReplicaSet: Keeping N Copies Running" darsida yozgan Reconcile metodi ham aslida shu termostat bilan bir xil naqsh: kuzat, solishtir, harakat qil. Bu darsda buni UMUMIY, istalgan turdagi "controller" uchun ishlaydigan interfeysga aylantiramiz.

example.go
package main

import "fmt"

// Controller — har qanday "kuzat, solishtir, harakat qil" tsiklini ifodalovchi umumiy interfeys
type Controller interface {
	Observe() int
	Desired() int
	Act()
}

// Reconcile — Observe va Desired TENG bo'lguncha Act'ni chaqiraveradi
func Reconcile(c Controller) int {
	steps := 0
	for c.Observe() != c.Desired() {
		c.Act()
		steps++
	}
	return steps
}

// ReplicaCount — oldingi darsdagi ReplicaSet g'oyasining, Controller interfeysiga moslashtirilgan ko'rinishi
type ReplicaCount struct {
	current int
	desired int
}

func (r *ReplicaCount) Observe() int { return r.current }
func (r *ReplicaCount) Desired() int { return r.desired }
func (r *ReplicaCount) Act() {
	if r.current < r.desired {
		r.current++
	} else if r.current > r.desired {
		r.current--
	}
}

func main() {
	rc := &ReplicaCount{current: 1, desired: 4}
	steps := Reconcile(rc)
	fmt.Println(steps, rc.current)
}

Controller — "Interface Design" darsida ko'rgan naqsh: UMUMIY xatti-harakatni ("kuzat, solishtir, harakat qil") KONKRET amalga oshirishdan ("bu aynan ReplicaSet haqida") AJRATISH. Reconcile funksiyasi ReplicaCount haqida HECH NARSA bilishi shart emas — u faqat Controller interfeysi bilan ishlaydi, shuning uchun XUDDI SHU funksiya, keyinchalik yozadigan istalgan boshqa "controller" uchun HAM ishlaydi.

Bu — real Kubernetes'ning ENG asosiy arxitektura g'oyasi: ReplicaSet controller, Deployment controller, Node controller — ularning HAMMASI, ichida turlicha logika bo'lsa ham, TASHQI ko'rinishda aynan shu bir xil "kuzat, solishtir, harakat qil" naqshini takrorlaydi. Shuning uchun Kubernetes'ga YANGI turdagi resurs qo'shish (masalan, siz o'zingiz "Putting It All Together" darsida ko'radigan kabi) — mavjud tizimni O'ZGARTIRISH emas, balki shu naqshga mos YANGI controller YOZISH, xolos.

>_ Exercise

Controller interfeysining IKKINCHI, mutlaqo boshqa sohadagi amalga oshirilishini yozing.

  • Temperature struct'ini yozing (current, desired int maydonlari bilan)
  • Unga Observe, Desired va Act metodlarini qo'shing (xuddi ReplicaCount'dagi kabi, current'ni desired'ga bir qadamda yaqinlashtiring)
  • current=10, desired=15 bilan Temperature yaratib, Reconcile(temp)ni chaqiring va steps, temp.current'ni chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Reconciliation loop — "kuzat, solishtir, harakat qil" naqshini interfeys orqali UMUMLASHTIRIB, bitta Reconcile funksiyasini ReplicaSet, Deployment yoki mutlaqo boshqa sohadagi (masalan, termostat) har qanday controller uchun qayta ishlatish imkonini beradi.

NEXT UP

Watching for Changes

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

The Reconciliation Loop Pattern

Reconciliation tsikli naqshi

Termostatni tasavvur qiling: u har soniyada xonaning JORIY haroratini o'lchaydi, buni siz BELGILAGAN haroratga solishtiradi, va farq bo'lsa — isituvchini yoqadi yoki o'chiradi. U hech qachon "tugatmaydi" — bu tsikl DOIMIY davom etadi. "ReplicaSet: Keeping N Copies Running" darsida yozgan Reconcile metodi ham aslida shu termostat bilan bir xil naqsh: kuzat, solishtir, harakat qil. Bu darsda buni UMUMIY, istalgan turdagi "controller" uchun ishlaydigan interfeysga aylantiramiz.

example.go
package main

import "fmt"

// Controller — har qanday "kuzat, solishtir, harakat qil" tsiklini ifodalovchi umumiy interfeys
type Controller interface {
	Observe() int
	Desired() int
	Act()
}

// Reconcile — Observe va Desired TENG bo'lguncha Act'ni chaqiraveradi
func Reconcile(c Controller) int {
	steps := 0
	for c.Observe() != c.Desired() {
		c.Act()
		steps++
	}
	return steps
}

// ReplicaCount — oldingi darsdagi ReplicaSet g'oyasining, Controller interfeysiga moslashtirilgan ko'rinishi
type ReplicaCount struct {
	current int
	desired int
}

func (r *ReplicaCount) Observe() int { return r.current }
func (r *ReplicaCount) Desired() int { return r.desired }
func (r *ReplicaCount) Act() {
	if r.current < r.desired {
		r.current++
	} else if r.current > r.desired {
		r.current--
	}
}

func main() {
	rc := &ReplicaCount{current: 1, desired: 4}
	steps := Reconcile(rc)
	fmt.Println(steps, rc.current)
}

Controller — "Interface Design" darsida ko'rgan naqsh: UMUMIY xatti-harakatni ("kuzat, solishtir, harakat qil") KONKRET amalga oshirishdan ("bu aynan ReplicaSet haqida") AJRATISH. Reconcile funksiyasi ReplicaCount haqida HECH NARSA bilishi shart emas — u faqat Controller interfeysi bilan ishlaydi, shuning uchun XUDDI SHU funksiya, keyinchalik yozadigan istalgan boshqa "controller" uchun HAM ishlaydi.

Bu — real Kubernetes'ning ENG asosiy arxitektura g'oyasi: ReplicaSet controller, Deployment controller, Node controller — ularning HAMMASI, ichida turlicha logika bo'lsa ham, TASHQI ko'rinishda aynan shu bir xil "kuzat, solishtir, harakat qil" naqshini takrorlaydi. Shuning uchun Kubernetes'ga YANGI turdagi resurs qo'shish (masalan, siz o'zingiz "Putting It All Together" darsida ko'radigan kabi) — mavjud tizimni O'ZGARTIRISH emas, balki shu naqshga mos YANGI controller YOZISH, xolos.

>_ Exercise

Controller interfeysining IKKINCHI, mutlaqo boshqa sohadagi amalga oshirilishini yozing.

  • Temperature struct'ini yozing (current, desired int maydonlari bilan)
  • Unga Observe, Desired va Act metodlarini qo'shing (xuddi ReplicaCount'dagi kabi, current'ni desired'ga bir qadamda yaqinlashtiring)
  • current=10, desired=15 bilan Temperature yaratib, Reconcile(temp)ni chaqiring va steps, temp.current'ni chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Reconciliation loop — "kuzat, solishtir, harakat qil" naqshini interfeys orqali UMUMLASHTIRIB, bitta Reconcile funksiyasini ReplicaSet, Deployment yoki mutlaqo boshqa sohadagi (masalan, termostat) har qanday controller uchun qayta ishlatish imkonini beradi.

NEXT UP

Watching for Changes