システム設計: Go でのシンプルなソーシャル メディア プラットフォームの構築

Patricia Arquette
リリース: 2024-11-09 21:36:02
オリジナル
479 人が閲覧しました

この記事では、低レベルのシステム設計原則に焦点を当てて、Go を使用した簡素化されたソーシャル メディア プラットフォームの設計について説明します。当社のプラットフォームには、ユーザー登録、投稿の作成、いいねやコメントの処理、ユーザーの最新情報を維持するための通知システムなどのコア機能が含まれています。この例は、これらの機能をモジュール式でスケーラブルで効率的なシステムにどのように組み込むことができるかを示しています。

Go の同時実行機能とファサードのようなデザイン パターンを使用して、合理化された保守可能な構造を作成し、プラットフォームがさまざまなユーザー インタラクションをシームレスに処理できるようにします。

私たちの設計の主要なコンポーネント

私たちが構築しているソーシャル メディア プラットフォームは、次の主な機能に重点を置いています。

  • ユーザー管理: ユーザー プロファイルの登録と管理。
  • 投稿の作成とインタラクション: 投稿の作成、いいね、コメント。
  • 通知: いいねやコメントなどの関連アクションをユーザーに警告します。
  • 同時実行性: 同時ユーザーアクションを効率的に処理します。

システムのコアコンポーネント

プラットフォームの主要コンポーネントを分解して、各部分がシステムにどのように統合されるかを見てみましょう。

  1. ユーザー管理

UserManager コンポーネントは、ユーザー登録とプロファイル管理を担当します。各ユーザーには ID、名前、略歴などの重要なプロファイルの詳細があり、マネージャーはユーザーを効率的に追加および取得できるようにします。いくつかの主要な機能は次のとおりです:

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
}
ログイン後にコピー
ログイン後にコピー

実際のアプリケーションでは、UserManager はデータベースに接続しますが、ここでは簡単にするためにマップを使用します。

  1. 投稿管理

PostManager は、投稿、いいね、コメントを管理することにより、ユーザーが作成したコンテンツを処理します。このコンポーネントを使用すると、ユーザーは投稿を作成したり、他の投稿に「いいね!」したり、コメントしたり、投稿を取得したりできます。いくつかの主要な機能は次のとおりです:

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
}
ログイン後にコピー

PostManager はデータベースと対話して投稿を保存および取得し、さまざまな基準によるフィルタリングを可能にします。

  1. 通知管理

NotificationManager は、ユーザーの投稿に対する「いいね!」やコメントの受信など、プラットフォームのアクティビティに関する最新情報をユーザーに提供し続ける責任があります。各通知タイプ (コメント、友達リクエストなど) はこのマネージャーを通じて送信され、ユーザーにリアルタイムで通知されます。いくつかの主要な機能は次のとおりです:

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
}

ログイン後にコピー

NotificationManager を使用すると、投稿に関連するインタラクションをユーザーに通知し、より魅力的なエクスペリエンスを実現できます。運用システムでは、チャネルまたはプッシュ通知を介して通知を送信できます。


ActivityFacade でのファサード パターンの使用

異なるコンポーネント間の相互作用を簡素化するために、Facade パターンを使用します。 ActivityFacade は、UserManager、PostManager、NotificationManager の機能を組み合わせて、ソーシャル メディア アプリに統一されたインターフェイスを提供します。

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
}
ログイン後にコピー
ログイン後にコピー

ActivityFacade を使用すると、プラットフォームとのユーザー操作を合理化し、各サブシステムを直接管理する複雑さを軽減できます。このアプローチにより、コードがよりモジュール化され、保守しやすくなり、拡張が容易になります。


同時実行性の処理

どのソーシャル メディア プラットフォームでも、複数のユーザーが同時にアクションを実行します。 Go の同時実行ツール、特に sync の RWMutex は、安全な方法で同時読み取りと同時書き込みを処理するのに最適です。

RWMutex を使用すると、複数のユーザーが同時に投稿を読むことができますが、「いいね」を付けたりコメントしたりできるのは一度に 1 人だけであるため、競合状態やデータの破損を防ぐことができます。


結論と次のステップ

Go のソーシャル メディア プラットフォーム向けの低レベル システム設計は、機能を拡張するための強力な基盤を提供し、スケーラブルで保守が容易になります。

将来の機能強化の可能性がある分野は次のとおりです。

  • WebSocket またはプッシュ通知を使用したリアルタイム通知。
  • 友達リクエストと投稿に対する高度なプライバシー管理
  • メモリ内マップを置き換えるデータベースを使用した永続的なデータ ストレージ。

完全なコード実装については、次のリポジトリを確認してください:

System Design: Building a Simple Social Media Platform in Go テサルツリー / 低レベル設計-golang

Golang による低レベルのシステム設計ソリューション

Go での低レベルのシステム設計

Go での低レベル システム設計 リポジトリへようこそ!このリポジトリには、Go で実装されたさまざまな低レベルのシステム設計の問題とその解決策が含まれています。主な目的は、実際の例を通じてシステムの設計とアーキテクチャを実証することです。

目次

  • 概要
  • 駐車場システム
  • エレベーターシステム
  • 図書館管理システム
  • 自動販売機システム
  • ソーシャルメディアプラットフォーム

概要

低レベルのシステム設計には、システム アーキテクチャの中核概念を理解し、拡張性、保守性、効率性の高いシステムを設計することが含まれます。このリポジトリは、Go を使用したさまざまな問題やシナリオの解決策をカバーしようとします。

駐車場システム

このリポジトリの最初のプロジェクトは、駐車場システムです。このシステムは、車両を駐車および駐車解除できる駐車場をシミュレートします。以下を示します:

  • 駐車場インスタンスを管理するためのシングルトン設計パターン。
  • さまざまな種類の車両 (乗用車、トラックなど) を扱います。
  • 複数のフロアにわたる駐車スペース管理。
  • 支払い処理中…


GitHub で表示


以上がシステム設計: Go でのシンプルなソーシャル メディア プラットフォームの構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート