この記事では、低レベルのシステム設計原則に焦点を当てて、Go を使用した簡素化されたソーシャル メディア プラットフォームの設計について説明します。当社のプラットフォームには、ユーザー登録、投稿の作成、いいねやコメントの処理、ユーザーの最新情報を維持するための通知システムなどのコア機能が含まれています。この例は、これらの機能をモジュール式でスケーラブルで効率的なシステムにどのように組み込むことができるかを示しています。
Go の同時実行機能とファサードのようなデザイン パターンを使用して、合理化された保守可能な構造を作成し、プラットフォームがさまざまなユーザー インタラクションをシームレスに処理できるようにします。
私たちが構築しているソーシャル メディア プラットフォームは、次の主な機能に重点を置いています。
プラットフォームの主要コンポーネントを分解して、各部分がシステムにどのように統合されるかを見てみましょう。
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 はデータベースに接続しますが、ここでは簡単にするためにマップを使用します。
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 はデータベースと対話して投稿を保存および取得し、さまざまな基準によるフィルタリングを可能にします。
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 を使用すると、投稿に関連するインタラクションをユーザーに通知し、より魅力的なエクスペリエンスを実現できます。運用システムでは、チャネルまたはプッシュ通知を介して通知を送信できます。
異なるコンポーネント間の相互作用を簡素化するために、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 のソーシャル メディア プラットフォーム向けの低レベル システム設計は、機能を拡張するための強力な基盤を提供し、スケーラブルで保守が容易になります。
将来の機能強化の可能性がある分野は次のとおりです。
完全なコード実装については、次のリポジトリを確認してください:
Go での低レベル システム設計 リポジトリへようこそ!このリポジトリには、Go で実装されたさまざまな低レベルのシステム設計の問題とその解決策が含まれています。主な目的は、実際の例を通じてシステムの設計とアーキテクチャを実証することです。
低レベルのシステム設計には、システム アーキテクチャの中核概念を理解し、拡張性、保守性、効率性の高いシステムを設計することが含まれます。このリポジトリは、Go を使用したさまざまな問題やシナリオの解決策をカバーしようとします。
このリポジトリの最初のプロジェクトは、駐車場システムです。このシステムは、車両を駐車および駐車解除できる駐車場をシミュレートします。以下を示します:
以上がシステム設計: Go でのシンプルなソーシャル メディア プラットフォームの構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。