Створення масштабованої системи управління бібліотекою на Go: поради з дизайну та паралельності.

У цій статті ми розглянемо створення Системи Управління Бібліотекою (LMS) за допомогою Go, зосередившись на її основних функціях, рішеннях дизайну та ключових фрагментах коду. Незалежно від того, чи ви початківець, чи досвідчений розробник, цей посібник допоможе вам зрозуміти, як побудувати масштабовану та ефективну систему.

pic

Основні функції системи управління бібліотекою

1. Управління книгами

Система підтримує кілька копій кожної книги, що дозволяє ефективно відслідковувати інвентар. Кожна книга має властивості, такі як ID, заголовок, автор, рік публікації та масив BookItem, що представляє окремі копії.

type Book struct {  
 ID int  
 BookItem []BookItem  
 Title string  
 Author string  
 PublishedYear string  
 mu sync.RWMutex  
}

2. Управління користувачами

Члени можуть позичати книги, а система відслідковує їх історію позик.

Кожен член має квоту на позики, щоб обмежити кількість книг, які він може позичити одночасно.

type Member struct {  
 ID int  
 Name string  
 ContactInfo string  
 CurrentBorrowed []*BookItem  
 BorrowHistory []*BookItem  
}

3. Позика та повернення книг

Система перевіряє наявність доступних копій і оновлює їхній статус при позичанні або поверненні. Історія позик також оновлюється для кожного члена.

func (m *Member) AddBorrowedBook(bookItem *BookItem) {  
 m.CurrentBorrowed = append(m.CurrentBorrowed, bookItem)  
}  

func (l *Library) BorrowBookByMember(memberID int, bookID int) *BookItem {  
 // Логіка позичання книги  
}

4. Контроль паралельного виконання

Використовуючи можливості паралельного виконання Go, система обробляє кілька запитів на позичання та повернення одночасно.

sync.RWMutex забезпечує безпечне для потоків виконання операцій, запобігаючи виникненню гонок.

func (b *Book) IsBookAvailable() bool {  
 b.mu.RLock()  
 defer b.mu.RUnlock()  
 for _, bookCopy := range b.BookItem {  
 if bookCopy.Status == Available {  
 return true  
 }  
 }  
 return false  
}

5. Управління простроченими книгами

Система перевіряє наявність прострочених книг, сповіщає членів і може накладати штрафи відповідно до бізнес-правил.

func (bi *BookItem) IsOverdue() bool {  
 if bi.Status != Borrowed {  
 return false  
 }  
 return time.Since(bi.LastBorrowed) > time.Hour*24*7  
}

Рішення щодо дизайну

Чому Go?

Go був обраний за свою простоту, ефективність і вбудовану підтримку паралельного виконання, що є необхідним для обробки кількох запитів у бібліотечному середовищі.

Його сильна типізація та перевірки під час компіляції також зменшують кількість помилок і покращують підтримуваність коду.

Шаблон Singleton для екземпляра бібліотеки

Система використовує шаблон одиничного екземпляра (singleton) для управління єдиним екземпляром бібліотеки, централізуючи операції, такі як додавання книг і управління членами.

var (  
 libraryInstance *Library  
 once sync.Once  
)  

func GetLibraryInstance() *Library {  
 once.Do(func() {  
 libraryInstance = &Library{books: make(map[int]*Book), members: make(map[int]*Member)}  
 })  
 return libraryInstance  
}

Інкапсуляція та захист даних

Мютекси (sync.RWMutex) захищають спільні ресурси, забезпечуючи сталий стан у багатокористувацькому середовищі, де кілька членів взаємодіють з системою одночасно.

Ознайомлення з кодом

Для повної реалізації та можливості внести внесок у подальші покращення, перегляньте репозиторій на GitHub:
https://github.com/DmitriiKumancev/low-level-design-systems

Ця стаття є частиною 5-частинної серії з низькорівневого дизайну в Go.

Залишайтеся з нами для ще більше інсайтів з системного дизайну!

Серія:

  1. Алгоритми планування ліфтів: FCFS, SSTF, SCAN, і LOOK
  2. Системний дизайн: Система управління бібліотекою
  3. Побудова торгового автомату на Go (скоро)
  4. Побудова простій соціальної медіа-платформи на Go (скоро)
  5. Побудова системи парковки на Go (скоро)

Це все! Сподіваюся, моя стаття була цікавою і корисною для вас 😎😜

Не забувайте про мій GitHub: https://github.com/DmitriiKumancev

pic

До зустрічі!❤️️

Перекладено з: Build a Scalable Library Management System in Go: Design & Concurrency Tips

Leave a Reply

Your email address will not be published. Required fields are marked *