Storage Engine
Saqlash mexanizmi
Kundalik daftar — har bir yangi yozuv OXIRIGA qo'shiladi, hech qachon o'rtadan o'chirilmaydi yoki qayta yozilmaydi. Log Aggregator'ning saqlash mexanizmi ham xuddi shunday ishlaydi — append-only (faqat qo'shish): yangi loglar doim OXIRIGA qo'shiladi, bu tartibni saqlab qolish ("qaysi voqea qachon sodir bo'lgan") uchun MUHIM.
package main
import (
"fmt"
"sync"
)
type LogEntry struct {
Level string
Service string
Message string
}
// LogStore — barcha log yozuvlarini, kelish tartibida, xavfsiz saqlaydi
type LogStore struct {
mu sync.RWMutex
entries []LogEntry
}
func NewLogStore() *LogStore {
return &LogStore{}
}
func (s *LogStore) Append(entry LogEntry) {
s.mu.Lock()
defer s.mu.Unlock()
s.entries = append(s.entries, entry)
}
func (s *LogStore) All() []LogEntry {
s.mu.RLock()
defer s.mu.RUnlock()
result := make([]LogEntry, len(s.entries))
copy(result, s.entries)
return result
}
func main() {
store := NewLogStore()
store.Append(LogEntry{Level: "INFO", Service: "payments", Message: "boshlandi"})
store.Append(LogEntry{Level: "ERROR", Service: "payments", Message: "muvaffaqiyatsiz"})
fmt.Println(len(store.All()))
}All() metodi natijani QAYTARISHDAN oldin copy orqali YANGI slice yaratadi — bu "Slices Deep Dive" darsida ko'rgan MUHIM ehtiyot chorasi: agar biz to'g'ridan-to'g'ri s.entriesning O'ZINI qaytarsak, chaqiruvchi kod uni TASHQARIDA o'zgartirib, LogStorening ICHKI holatini BUZISHI mumkin edi (mutex bilan HIMOYALANMAGAN holda).
Bu — "URL Shortener"dagi Store va "In-Memory Cache"dagi Cache bilan bir xil naqsh: sync.RWMutex orqali ko'plab PARALLEL Append chaqiruvi (masalan turli servislardan bir vaqtda kelayotgan loglar) XAVFSIZ ishlaydi, All() esa istalgan vaqtda BARCHA loglarni xavfsiz o'qib olish imkonini beradi.
>_ Exercise
LogStore'ga oxirgi N ta yozuvni olish imkonini qo'shing.
- •Tail(n int) []LogEntry metodini yozing: agar n dan ko'p yozuv bo'lmasa, hammasini qaytaring; aks holda OXIRGI n tasini qaytaring
- •5 ta yozuvni Append qiling
- •Tail(2) natijasining uzunligini VA oxirgi yozuvning Message'ini chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Append-only saqlash — log yozuvlarini kelish tartibida, o'zgarmas holda saqlaydi; Tail kabi metodlar orqali eng so'nggi yozuvlarga tez kirish, log tizimlarida eng ko'p ishlatiladigan so'rov turlaridan biridir.
NEXT UP
Search Indexing
$ go run main.go
Kodingizni ishga tushiring