GoDasturchi
Real-Time Tail

Real-Time Tail

Jonli kuzatish (Real-Time Tail)

Terminalda tail -f buyrug'ini ishlatganingizda, fayl OXIRIDA yangi qatorlar paydo bo'lgani sari, ular DARHOL ekranga chiqadi — siz faylni QAYTA-QAYTA ochib o'qishga hojat qolmaydi. Real-Time Tail — Log Aggregator'da xuddi shu tajribani beradi: yangi log kelgan ZAHOTI, uni "tomosha qilayotgan" mijozlarga DARHOL yetkazish.

example.go
package main

import "fmt"

type LogEntry struct {
	Message string
}

// Broadcaster — yangi loglarni barcha "obunachi"larga yetkazadi (pub-sub naqshi)
type Broadcaster struct {
	subscribers []chan LogEntry
}

func NewBroadcaster() *Broadcaster {
	return &Broadcaster{}
}

// Subscribe — yangi "tomoshabin" qo'shadi, unga tegishli kanalni qaytaradi
func (b *Broadcaster) Subscribe() chan LogEntry {
	ch := make(chan LogEntry, 10)
	b.subscribers = append(b.subscribers, ch)
	return ch
}

// Publish — yangi log kelganda, uni BARCHA obunachilarga yuboradi
func (b *Broadcaster) Publish(entry LogEntry) {
	for _, ch := range b.subscribers {
		ch <- entry
	}
}

func main() {
	broadcaster := NewBroadcaster()
	sub1 := broadcaster.Subscribe()
	sub2 := broadcaster.Subscribe()

	broadcaster.Publish(LogEntry{Message: "yangi voqea"})

	entry1 := <-sub1
	entry2 := <-sub2
	fmt.Println(entry1.Message, entry2.Message)
}

Bu — "Pub-Sub Pattern" (nashr qiluvchi — obuna bo'luvchi) deb ataladigan, KENG tarqalgan naqsh: Broadcaster YANGI log qayerdan kelishini yoki uni KIM "tomosha qilishi"ni BILISHI shart emas, u faqat har bir Publish chaqiruvida BARCHA ro'yxatdagi kanallarga yuboradi. Har bir "tomoshabin" (masalan, veb-brauzerda ochiq turgan "jonli log" sahifasi) o'ZINING kanali orqali, MUSTAQIL ravishda yangiliklarni oladi.

Har bir obunachi kanali BUFERLANGAN (make(chan LogEntry, 10)) qilib yaratilgani MUHIM: agar biror obunachi "sekin" bo'lsa (masalan brauzer vaqtincha javob bermasa), Publish UNGA yuborishda BLOKLANIB qolmaydi — buffer TO'LGUNCHA, u yangi loglarni QABUL qilishda davom etadi.

>_ Exercise

Broadcaster'ga obunachini olib tashlash (Unsubscribe) imkonini qo'shing.

  • Unsubscribe(ch chan LogEntry) metodini yozing: subscribers slice'dan berilgan kanalni topib, o'chirib tashlang
  • Ikkita obunachi yarating, birinchisini Unsubscribe qiling
  • Publish qiling, so'ng len(b.subscribers) qiymatini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Pub-sub (Broadcaster) naqshi — yangi loglarni barcha buferlangan kanal orqali obuna bo'lgan tomoshabinlarga real vaqtda yetkazadi, bittasining sekinligi boshqalarga yoki nashr qiluvchining o'ziga to'sqinlik qilmasligini ta'minlaydi.

NEXT UP

Aggregations

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Real-Time Tail

Jonli kuzatish (Real-Time Tail)

Terminalda tail -f buyrug'ini ishlatganingizda, fayl OXIRIDA yangi qatorlar paydo bo'lgani sari, ular DARHOL ekranga chiqadi — siz faylni QAYTA-QAYTA ochib o'qishga hojat qolmaydi. Real-Time Tail — Log Aggregator'da xuddi shu tajribani beradi: yangi log kelgan ZAHOTI, uni "tomosha qilayotgan" mijozlarga DARHOL yetkazish.

example.go
package main

import "fmt"

type LogEntry struct {
	Message string
}

// Broadcaster — yangi loglarni barcha "obunachi"larga yetkazadi (pub-sub naqshi)
type Broadcaster struct {
	subscribers []chan LogEntry
}

func NewBroadcaster() *Broadcaster {
	return &Broadcaster{}
}

// Subscribe — yangi "tomoshabin" qo'shadi, unga tegishli kanalni qaytaradi
func (b *Broadcaster) Subscribe() chan LogEntry {
	ch := make(chan LogEntry, 10)
	b.subscribers = append(b.subscribers, ch)
	return ch
}

// Publish — yangi log kelganda, uni BARCHA obunachilarga yuboradi
func (b *Broadcaster) Publish(entry LogEntry) {
	for _, ch := range b.subscribers {
		ch <- entry
	}
}

func main() {
	broadcaster := NewBroadcaster()
	sub1 := broadcaster.Subscribe()
	sub2 := broadcaster.Subscribe()

	broadcaster.Publish(LogEntry{Message: "yangi voqea"})

	entry1 := <-sub1
	entry2 := <-sub2
	fmt.Println(entry1.Message, entry2.Message)
}

Bu — "Pub-Sub Pattern" (nashr qiluvchi — obuna bo'luvchi) deb ataladigan, KENG tarqalgan naqsh: Broadcaster YANGI log qayerdan kelishini yoki uni KIM "tomosha qilishi"ni BILISHI shart emas, u faqat har bir Publish chaqiruvida BARCHA ro'yxatdagi kanallarga yuboradi. Har bir "tomoshabin" (masalan, veb-brauzerda ochiq turgan "jonli log" sahifasi) o'ZINING kanali orqali, MUSTAQIL ravishda yangiliklarni oladi.

Har bir obunachi kanali BUFERLANGAN (make(chan LogEntry, 10)) qilib yaratilgani MUHIM: agar biror obunachi "sekin" bo'lsa (masalan brauzer vaqtincha javob bermasa), Publish UNGA yuborishda BLOKLANIB qolmaydi — buffer TO'LGUNCHA, u yangi loglarni QABUL qilishda davom etadi.

>_ Exercise

Broadcaster'ga obunachini olib tashlash (Unsubscribe) imkonini qo'shing.

  • Unsubscribe(ch chan LogEntry) metodini yozing: subscribers slice'dan berilgan kanalni topib, o'chirib tashlang
  • Ikkita obunachi yarating, birinchisini Unsubscribe qiling
  • Publish qiling, so'ng len(b.subscribers) qiymatini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Pub-sub (Broadcaster) naqshi — yangi loglarni barcha buferlangan kanal orqali obuna bo'lgan tomoshabinlarga real vaqtda yetkazadi, bittasining sekinligi boshqalarga yoki nashr qiluvchining o'ziga to'sqinlik qilmasligini ta'minlaydi.

NEXT UP

Aggregations