Rumah >pembangunan bahagian belakang >Golang >Reka Bentuk Sistem: Membina Platform Media Sosial Mudah dalam Go

Reka Bentuk Sistem: Membina Platform Media Sosial Mudah dalam Go

Patricia Arquette
Patricia Arquetteasal
2024-11-09 21:36:02538semak imbas

Dalam artikel ini, kami akan menelusuri reka bentuk platform media sosial yang dipermudah menggunakan Go, memfokuskan pada prinsip reka bentuk sistem peringkat rendah. Platform kami termasuk ciri teras seperti pendaftaran pengguna, membuat siaran, pengendalian suka dan ulasan, dan sistem pemberitahuan untuk memastikan pengguna sentiasa dikemas kini. Contoh ini menggambarkan cara ciri ini boleh dibina ke dalam sistem yang modular, berskala dan cekap.

Kami akan menggunakan keupayaan serentak Go dan corak reka bentuk seperti fasad untuk mencipta struktur yang diperkemas dan boleh diselenggara, membolehkan platform mengendalikan pelbagai interaksi pengguna dengan lancar.

Komponen Utama Reka Bentuk Kami

Platform media sosial yang kami bina memfokuskan pada ciri utama ini:

  • Pengurusan Pengguna: Mendaftar dan mengurus profil pengguna.
  • Penciptaan dan Interaksi Siaran: Membuat siaran, menyukai dan mengulas.
  • Pemberitahuan: Memaklumkan pengguna tentang tindakan yang berkaitan seperti suka dan ulasan.
  • Concurrency: Mengendalikan tindakan pengguna serentak dengan cekap.

Komponen Teras Sistem

Mari kita pecahkan komponen utama platform kami dan lihat cara setiap bahagian disepadukan ke dalam sistem.

  1. Pengurusan Pengguna

Komponen UserManager bertanggungjawab untuk pendaftaran pengguna dan pengurusan profil. Setiap pengguna mempunyai butiran profil penting seperti ID, nama dan bio, dan pengurus memastikan pengguna boleh ditambah dan diambil dengan cekap. Beberapa fungsi utama ialah:

type User struct {
    type User struct {
    ID             int
    Name           string
    Email          string
    Password       string
    DisplayPicture *string
    Bio            *string
    friends        map[int]*User
    posts          []*Post
}

type UserManager struct {
    users map[int]*User
    mu    sync.RWMutex
}

func (um *UserManager) AddUser(user *User) {
    um.mu.Lock()
    defer um.mu.Unlock()
    um.users[user.ID] = user
    fmt.Printf("User added: %d\n", user.ID)
}

func (um *UserManager) GetUserByID(userID int) (*User, error) {
    um.mu.RLock()
    defer um.mu.RUnlock()
    user, ok := um.users[userID]
    if !ok {
        return nil, fmt.Errorf("user not found")
    }
    return user, nil
}

func (um *UserManager) AddFriend(requesterID, receiverID int) error {
    requester, err := um.GetUserByID(requesterID)
    if err != nil {
        return err
    }

    receiver, err := um.GetUserByID(receiverID)
    if err != nil {
        return err
    }

    requester.AddFriend(receiver)
    receiver.AddFriend(requester)
    fmt.Printf("Friendship added between users: %d and %d\n", requesterID, receiverID)
    return nil
}

Dalam aplikasi dunia sebenar, UserManager akan menyambung ke pangkalan data, tetapi di sini kami menggunakan peta untuk kesederhanaan.

  1. Pengurusan Jawatan

PostManager mengendalikan kandungan yang dijana pengguna dengan mengurus siaran, suka dan ulasan. Komponen ini membolehkan pengguna membuat siaran, seperti siaran orang lain, mengulas dan mendapatkan semula siaran. Beberapa fungsi utama ialah:

type Post struct {
    ID              int
    UserID          int
    Content         string
    IsPublished     bool
    URLs            []*string
    Likes           int
    Comments        []*Comment
    PublishedAt     time.Time
    CommentsEnabled bool
    HiddenFromUsers map[int]bool
}

type PostManager struct {
    posts map[int]*Post
    mu    sync.RWMutex
}

func (pm *PostManager) GetPost(postID int) (*Post, error) {
    pm.mu.RLock()
    defer pm.mu.RUnlock()

    post, exists := pm.posts[postID]
    if !exists {
        return nil, fmt.Errorf("post not found")
    }
    return post, nil
}

func (pm *PostManager) AddPost(post *Post, user *User) {
    pm.mu.Lock()
    defer pm.mu.Unlock()
    pm.posts[post.ID] = post

    user.AddPost(post)
}

func (pm *PostManager) LikePost(postID int) (*Post, error) {
    pm.mu.Lock()
    post := pm.posts[postID]
    pm.mu.Unlock()

    if post == nil {
        return nil, fmt.Errorf("post not found")
    }

    pm.mu.Lock()
    defer pm.mu.Unlock()

    post.Like()
    return post, nil
}

Pengurus Pos boleh berinteraksi dengan pangkalan data untuk menyimpan dan mendapatkan semula siaran, membenarkan penapisan mengikut pelbagai kriteria.

  1. Pengurusan Pemberitahuan

Pengurus Pemberitahuan bertanggungjawab untuk memastikan pengguna dikemas kini tentang aktiviti platform, seperti menerima suka atau mengulas pada siaran mereka. Setiap jenis pemberitahuan (suka, ulasan, permintaan rakan) dihantar melalui pengurus ini, memastikan pengguna dimaklumkan dalam masa nyata. Beberapa fungsi utama ialah:

type Notification struct {
    ID      string
    Type    NotificationType
    Content string
    UserID  int
}

type NotificationManager struct {
    notifications map[int][]*Notification
    mu            sync.RWMutex
}

func (nm *NotificationManager) AddNotification(userID int, notificationType NotificationType, message string) {
    nm.mu.Lock()
    defer nm.mu.Unlock()

    notification := NewNotification(fmt.Sprintf("notification-%d", time.Now().UnixMicro()), notificationType, message, userID)
    nm.notifications[userID] = append(nm.notifications[userID], notification)
}

func (nm *NotificationManager) GetNotificationsForUser(userID int) ([]*Notification, error) {
    nm.mu.RLock()
    defer nm.mu.RUnlock()

    notifications, ok := nm.notifications[userID]
    if !ok {
        return nil, fmt.Errorf("user not found")
    }
    return notifications, nil
}

Dengan NotificationManager, kami boleh memberitahu pengguna tentang interaksi yang berkaitan dengan siaran mereka, membolehkan pengalaman yang lebih menarik. Dalam sistem pengeluaran, pemberitahuan boleh dihantar melalui saluran atau pemberitahuan tolak.


Menggunakan Corak Fasad dengan ActivityFacade

Untuk memudahkan interaksi antara komponen yang berbeza, kami menggunakan corak Fasad. ActivityFacade menggabungkan fungsi UserManager, PostManager dan NotificationManager, menyediakan antara muka bersatu untuk apl media sosial kami.

type User struct {
    type User struct {
    ID             int
    Name           string
    Email          string
    Password       string
    DisplayPicture *string
    Bio            *string
    friends        map[int]*User
    posts          []*Post
}

type UserManager struct {
    users map[int]*User
    mu    sync.RWMutex
}

func (um *UserManager) AddUser(user *User) {
    um.mu.Lock()
    defer um.mu.Unlock()
    um.users[user.ID] = user
    fmt.Printf("User added: %d\n", user.ID)
}

func (um *UserManager) GetUserByID(userID int) (*User, error) {
    um.mu.RLock()
    defer um.mu.RUnlock()
    user, ok := um.users[userID]
    if !ok {
        return nil, fmt.Errorf("user not found")
    }
    return user, nil
}

func (um *UserManager) AddFriend(requesterID, receiverID int) error {
    requester, err := um.GetUserByID(requesterID)
    if err != nil {
        return err
    }

    receiver, err := um.GetUserByID(receiverID)
    if err != nil {
        return err
    }

    requester.AddFriend(receiver)
    receiver.AddFriend(requester)
    fmt.Printf("Friendship added between users: %d and %d\n", requesterID, receiverID)
    return nil
}

Dengan ActivityFacade, kami boleh menyelaraskan interaksi pengguna dengan platform, mengurangkan kerumitan mengurus secara langsung setiap subsistem. Pendekatan ini menjadikan kod lebih modular, boleh diselenggara dan lebih mudah dikembangkan.


Mengendalikan Concurrency

Dalam mana-mana platform media sosial, berbilang pengguna melakukan tindakan secara serentak. Alat konkurensi Go, terutamanya RWMutex penyegerakan, sesuai untuk mengendalikan bacaan dan tulis serentak dengan cara yang selamat.

Menggunakan RWMutex, kami memastikan berbilang pengguna boleh membaca siaran serentak, tetapi hanya seorang yang boleh menyukai atau mengulas pada satu-satu masa, menghalang keadaan perlumbaan dan rasuah data.


Kesimpulan dan langkah seterusnya

Reka bentuk sistem peringkat rendah kami untuk platform media sosial di Go menyediakan asas yang kukuh untuk mengembangkan ciri menjadikannya berskala dan mudah diselenggara.

Bidang yang berpotensi untuk peningkatan masa depan termasuk:

  • Pemberitahuan Masa Nyata menggunakan WebSockets atau pemberitahuan tolak.
  • Kawalan Privasi Terperinci untuk permintaan dan siaran rakan.
  • Storan Data Berterusan dengan pangkalan data untuk menggantikan peta dalam memori.

Untuk pelaksanaan kod penuh, sila semak repositori berikut:

System Design: Building a Simple Social Media Platform in Go thesaltree / low-level-design-golang

Penyelesaian reka bentuk sistem tahap rendah di Golang

Reka Bentuk Sistem Aras Rendah dalam Go

Selamat datang ke repositori Reka Bentuk Sistem Tahap Rendah dalam Go! Repositori ini mengandungi pelbagai masalah reka bentuk sistem peringkat rendah dan penyelesaiannya dilaksanakan dalam Go. Matlamat utama adalah untuk menunjukkan reka bentuk dan seni bina sistem melalui contoh praktikal.

Jadual Kandungan

  • Ikhtisar
  • Sistem Tempat Letak Kereta
  • Sistem Lif
  • Sistem Pengurusan Perpustakaan
  • Sistem Mesin Layan Diri
  • Platform Media Sosial

Ikhtisar

Reka bentuk sistem peringkat rendah melibatkan pemahaman konsep teras seni bina sistem dan mereka bentuk sistem berskala, boleh diselenggara dan cekap. Repositori ini akan cuba merangkumi penyelesaian pelbagai masalah dan senario menggunakan Go.

Sistem Tempat Letak Kereta

Projek pertama dalam repositori ini ialah Sistem Tempat Letak Kereta. Sistem ini menyerupai tempat letak kereta di mana kenderaan boleh diletakkan dan tidak diletakkan. Ia menunjukkan:

  • Corak reka bentuk singleton untuk menguruskan contoh tempat letak kereta.
  • Mengendalikan pelbagai jenis kenderaan (cth., kereta, trak).
  • Pengurusan ruang letak kereta merentas berbilang tingkat.
  • Pemprosesan pembayaran untuk…


Lihat di GitHub


Atas ialah kandungan terperinci Reka Bentuk Sistem: Membina Platform Media Sosial Mudah dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn