GoDasturchi
Deployment Rollback

Deployment Rollback

Deployment'ni orqaga qaytarish

Retseptni takomillashtirib borayotgan oshpazni tasavvur qiling: u har bir yangi retsept variantini ESKISINI TASHLAMASDAN, alohida qayd qilib boradi. Agar yangi retsept ("3-versiya") mijozlarga yoqmasa, oshpaz uni butunlay qaytadan o'ylab topish o'rniga, shunchaki oldingi, yaxshi ishlagan "2-versiya" qaydiga QAYTADI. Kubernetes'dagi Deployment ham har bir yangilanishni tarix sifatida saqlaydi va rollback orqali istalgan oldingi versiyaga qaytish imkonini beradi.

example.go
package main

import "fmt"

type Revision struct {
	Version int
	Image   string
}

type Deployment struct {
	Name    string
	Current Revision
	History []Revision
}

func NewDeployment(name, image string) *Deployment {
	rev := Revision{Version: 1, Image: image}
	return &Deployment{Name: name, Current: rev, History: []Revision{rev}}
}

func (d *Deployment) Update(image string) {
	rev := Revision{Version: d.Current.Version + 1, Image: image}
	d.History = append(d.History, rev)
	d.Current = rev
}

func (d *Deployment) Rollback(toVersion int) error {
	for _, rev := range d.History {
		if rev.Version == toVersion {
			d.Current = rev
			return nil
		}
	}
	return fmt.Errorf("%d-versiya topilmadi", toVersion)
}

func main() {
	dep := NewDeployment("web", "myapp:v1")
	dep.Update("myapp:v2")
	dep.Update("myapp:v3")
	fmt.Println(dep.Current.Version, dep.Current.Image)

	dep.Rollback(1)
	fmt.Println(dep.Current.Version, dep.Current.Image)
}

History []Revision — HAR bir Update chaqiruvida yangi yozuv QO'SHIB boriladi, eskilari hech qachon o'chirilmaydi ("Append-Only" naqshini eslang). Rollback(toVersion) — tarix bo'ylab qidirib, mos versiyani Current qilib belgilaydi. Diqqat: rollback YANGI versiya YARATMAYDI, faqat Currentni ESKI qaydga ishora qildiradi — garchi real Kubernetes'da bu texnik jihatdan yangi rollout sifatida qayd qilinsa ham, natija bir xil: ESKI konfiguratsiya qayta faollashadi.

Bu funksiya ayniqsa production'da MUHIM: agar yangi versiya (v3) xatolarga olib kelsa, uni tuzatishni KUTIB o'tirish o'rniga, DARHOL oldingi, ISHLAGAN versiyaga (v2 yoki undan ham oldingisiga) qaytish mumkin — bu "Systematic Debugging" kursida ko'rgan "avval xavfsiz holatga qayt, keyin sabab bilan shug'ullan" tamoyilining amaliy ko'rinishi.

>_ Exercise

Bevosita oldingi versiyaga bir qadamda qaytish imkonini qo'shing.

  • RollbackToPrevious() error metodini yozing: d.Rollback(d.Current.Version - 1) ni chaqiring va natijasini qaytaring
  • Deployment yaratib, ikki marta Update qiling (v1 -> v2 -> v3)
  • RollbackToPrevious() ni chaqiring, so'ng dep.Current.Version va dep.Current.Image ni chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Deployment har bir yangilanishni versiyalar tarixi sifatida saqlaydi, shu orqali muammoli versiyadan darhol, oldingi ishlagan holatga rollback qilish imkonini beradi.

NEXT UP

Service: Stable Networking for Pods

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Deployment Rollback

Deployment'ni orqaga qaytarish

Retseptni takomillashtirib borayotgan oshpazni tasavvur qiling: u har bir yangi retsept variantini ESKISINI TASHLAMASDAN, alohida qayd qilib boradi. Agar yangi retsept ("3-versiya") mijozlarga yoqmasa, oshpaz uni butunlay qaytadan o'ylab topish o'rniga, shunchaki oldingi, yaxshi ishlagan "2-versiya" qaydiga QAYTADI. Kubernetes'dagi Deployment ham har bir yangilanishni tarix sifatida saqlaydi va rollback orqali istalgan oldingi versiyaga qaytish imkonini beradi.

example.go
package main

import "fmt"

type Revision struct {
	Version int
	Image   string
}

type Deployment struct {
	Name    string
	Current Revision
	History []Revision
}

func NewDeployment(name, image string) *Deployment {
	rev := Revision{Version: 1, Image: image}
	return &Deployment{Name: name, Current: rev, History: []Revision{rev}}
}

func (d *Deployment) Update(image string) {
	rev := Revision{Version: d.Current.Version + 1, Image: image}
	d.History = append(d.History, rev)
	d.Current = rev
}

func (d *Deployment) Rollback(toVersion int) error {
	for _, rev := range d.History {
		if rev.Version == toVersion {
			d.Current = rev
			return nil
		}
	}
	return fmt.Errorf("%d-versiya topilmadi", toVersion)
}

func main() {
	dep := NewDeployment("web", "myapp:v1")
	dep.Update("myapp:v2")
	dep.Update("myapp:v3")
	fmt.Println(dep.Current.Version, dep.Current.Image)

	dep.Rollback(1)
	fmt.Println(dep.Current.Version, dep.Current.Image)
}

History []Revision — HAR bir Update chaqiruvida yangi yozuv QO'SHIB boriladi, eskilari hech qachon o'chirilmaydi ("Append-Only" naqshini eslang). Rollback(toVersion) — tarix bo'ylab qidirib, mos versiyani Current qilib belgilaydi. Diqqat: rollback YANGI versiya YARATMAYDI, faqat Currentni ESKI qaydga ishora qildiradi — garchi real Kubernetes'da bu texnik jihatdan yangi rollout sifatida qayd qilinsa ham, natija bir xil: ESKI konfiguratsiya qayta faollashadi.

Bu funksiya ayniqsa production'da MUHIM: agar yangi versiya (v3) xatolarga olib kelsa, uni tuzatishni KUTIB o'tirish o'rniga, DARHOL oldingi, ISHLAGAN versiyaga (v2 yoki undan ham oldingisiga) qaytish mumkin — bu "Systematic Debugging" kursida ko'rgan "avval xavfsiz holatga qayt, keyin sabab bilan shug'ullan" tamoyilining amaliy ko'rinishi.

>_ Exercise

Bevosita oldingi versiyaga bir qadamda qaytish imkonini qo'shing.

  • RollbackToPrevious() error metodini yozing: d.Rollback(d.Current.Version - 1) ni chaqiring va natijasini qaytaring
  • Deployment yaratib, ikki marta Update qiling (v1 -> v2 -> v3)
  • RollbackToPrevious() ni chaqiring, so'ng dep.Current.Version va dep.Current.Image ni chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Deployment har bir yangilanishni versiyalar tarixi sifatida saqlaydi, shu orqali muammoli versiyadan darhol, oldingi ishlagan holatga rollback qilish imkonini beradi.

NEXT UP

Service: Stable Networking for Pods