4.5 פיד חברתי תרגול
מימוש Hybrid Fan-out¶
תרגיל 1 - Fan-out Simulator¶
מימשו גרסה מפושטת של Hybrid Fan-out:
class SocialFeedSystem:
CELEBRITY_THRESHOLD = 10 # נמוך לצורך הדמו
def __init__(self):
self.posts = {} # post_id -> post
self.followers = {} # user_id -> set of follower_ids
self.following = {} # user_id -> set of followed_ids
self.feed_cache = {} # user_id -> list of post_ids
self._next_post_id = 1
def follow(self, follower_id: int, followee_id: int):
...
def get_follower_count(self, user_id: int) -> int:
...
def publish_post(self, author_id: int, content: str) -> int:
"""מחזיר post_id"""
...
def get_feed(self, user_id: int, limit: int = 10) -> list[dict]:
"""מחזיר פוסטים ממויינים לפי זמן"""
...
בדיקה:
system = SocialFeedSystem()
# צרו celebrity עם הרבה עוקבים
for i in range(1, 15):
system.follow(follower_id=i, followee_id=100) # celebrity
# user 1 עוקב גם אחרי user 2
system.follow(follower_id=1, followee_id=2)
# פרסמו פוסטים
system.publish_post(2, "פוסט של חבר רגיל")
system.publish_post(100, "פוסט של celebrity!")
# הפיד של user 1 צריך להכיל את שני הפוסטים
feed = system.get_feed(user_id=1)
print(len(feed)) # 2
תרגיל 2 - שאלות עיצוב¶
- מה היתרון של Fan-out on Write על Fan-out on Read עבור משתמשים רגילים?
- למה celebrities נטפלים אחרת? מה יקרה אם לא?
- Beyonce Problem: כשcelebrity עם 100 מיליון עוקבים מפרסמת פוסט - מה יקרה אם נשתמש בFan-out on Write? איך פותרים?
- אם רוצים לתמוך בposts של תמונות כבדות (10MB כל אחת) - מה צריך לשנות בארכיטקטורה?
תרגיל 3 - עיצוב סיום¶
תכננו מערכת פיד ל-TaskFlow: "Activity Feed" שבו משתמש רואה עדכונים על משימות ופרויקטים שמעורב בהם.
גדרו:
1. אילו אירועים מופיעים בפיד (task created, assigned, commented, completed...)
2. מי מקבל כל אירוע?
3. איזו גישה (push/pull/hybrid) מתאימה ולמה?
4. כמה זמן שומרים עדכונים בפיד?