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