פיתוח מודול צ'אט וחברתי מוכן לשימוש למשחקים
אנחנו בונים צ'אטים מרובי משתתפים ומודולים חברתיים שלא נשברים תחת עומס ונמנעים מתנאי מרוץ עם לוגיקת המשחק. עם ניסיון של למעלה מ-7 שנים בפיתוח משחקים ויותר מ-30 פרויקטים שהושלמו, אנחנו יודעים לבנות שכבת זמן אמת שעומדת בשיא של משתמשים בו-זמנית ללא פגיעה ב-RTT.
למה צ'אט בערוץ יחיד הוא רעיון רע?
הטעות הנפוצה ביותר היא שימוש בערוץ תעבורה אחד גם לאירועי משחק וגם להודעות צ'אט. ב-Photon Realtime, לכל ערוץ יש הבטחת FIFO בתוך עצמו, אבל לא בין ערוצים. אם קודי RaiseEvent של תנועת שחקנים והודעות טקסט עוברים בערוץ 0, עלייה בפעילות הצ'אט מגדילה את זמן ההשהיה של המיקום ל-200–300 אלפיות השנייה גם עם פינג טוב. פתרון: להקצות ערוץ לא אמין נפרד לצ'אט עם עדיפות נמוכה וערוץ אמין להודעות מערכת (בעיטה, חסימה, הזמנה).
מה כלול בעבודה?
- תיעוד ארכיטקטוני (סכימת נתונים, ערוצים, עדיפויות)
- אינטגרציה של Photon Chat או שרת מותאם אישית
- מימוש היסטוריית הודעות, פגינציה, ניקוי TTL
- ניהול תוכן (פילטר ML, הגבלת קצב, השתקה/חסימה)
- גרף חברתי (חברים, קבוצות, הזמנות)
- התראות Push (FCM, WNS) דרך תור אסינכרוני
- בדיקות עומס עם בוטים על Unity ללא ממשק גרפי
- קוד מקור, README, מיגרציות, הדרכת צוות
איפה יישומים ראשונים בדרך כלל נשברים
הבעיה השנייה היא אחסון היסטוריה. צוותים רבים מאחסנים היסטוריית צ'אט ישירות בחדר Photon דרך CustomRoomProperties, מה שעובד עד שחורגים ממגבלת ה-1 KB לנכס. אחרי זה, הודעות אובדות בשקט בצד הלקוח. הגישה הנכונה: להעביר את ההיסטוריה למיקרוסרוויס נפרד עם PostgreSQL או Redis Streams, ולהשאיר בחדר רק מצביע למיקום הקריאה האחרון.
הכאב השלישי הוא ניהול תוכן בזמן אמת. סינון RegExp פשוט בצד הלקוח נעקף תוך שניות. אימות בצד השרת דרך Photon WebHooks v2 מוסיף זמן השהיה לכל הודעה. פשרה שעובדת: ניהול תוכן אסינכרוני עם הצגת הודעה מיידית לשולח ועיכוב במשלוח לאחרים דרך חוצץ של 50–100 אלפיות השנייה, שבמהלכו פועל פילטר ה-ML.
איך לבחור בין Photon Chat לשרת מותאם אישית?
| פתרון | זמן השהיה | מדרגיות | גמישות | עלות |
|---|---|---|---|---|
| Photon Chat | <50 אלפיות השנייה | גבוהה (תשתית מוכנה) | נמוכה (רק ערוצים בסיסיים) | רישיון + שימוש |
| שרת מותאם אישית (Node/Go) | <50 אלפיות השנייה | תלוי במימוש | מלאה (תפקידים, קבוצות, אנליטיקה) | פיתוח + אחסון |
אם הפרויקט שלך הוא mid-core עם קבוצות, תפקידים מותאמים אישית וניהול תוכן, שרת מותאם אישית משתלם דרך השליטה. למשחקים קז'ואל פשוטים עם צ'אט יחיד, Photon Chat מספיק.
בניית השכבה החברתית על גבי סשן המשחק
צ'אט הוא החלק הגלוי. מתחת לפני השטח, בדרך כלל צריך: רשימת חברים, הזמנות, מערכת קבוצות/שבטים, סטטוס מקוון/לא מקוון, התראות. Photon מציעה Photon Chat כ-SDK נפרד עם שרתים משלו—הוא פותר משימות בסיסיות (ערוצים ציבוריים, הודעות פרטיות) אבל לא תומך בתפקידים מותאמים אישית והרשאות גישה. למשחקים עם קבוצות, המגבלה הזו קריטית.
ארכיטקטורה טיפוסית שאנחנו משתמשים בה לפרויקטים mid-core: Photon Chat למסירה בזמן אמת + REST API מותאם אישית על Laravel/Node לניהול מבנים (קבוצות, תפקידים, השתקה/חסימה), PostgreSQL לאחסון, Redis Pub/Sub לשידור אירועים בין מופעי API. לקוח Unity נרשם לערוץ Photon Chat לפי מזהה קבוצה, ומטא-דאטה (שם, אווטאר, חברים) נמשך דרך REST בכניסה ללובי.
בפרויקט אחד—משחק battle royale נייד עם 100 שחקנים—נתקלנו בעלייה חדה בחיבורי Photon Chat כשמעל 80 שחקנים נכנסו בו-זמנית ללובי המשחק, מה שגרם לקריסה של אזור EU-West בערך פעם בשבוע. תיקנו את זה עם backoff אקספוננציאלי בצד הלקוח (מ-500 אלפיות השנייה עד 8 שניות, jitter ±200 אלפיות השנייה) והרשמה עצלה: ערוץ הקבוצה נרשם רק אחרי אישור רשימת השחקנים, לא ברגע JoinRoom. זה הפחית את עומס ההרשמה ב-40%.
באילו כלים אנחנו משתמשים?
לפרויקטי Unity, הסט העיקרי: Photon Chat SDK, Photon Realtime לאירועי משחק, Mirror Networking או Netcode for GameObjects כחלופות להגדרות p2p. צד השרת של הצ'אט משתמש ב-Photon WebHooks v2 לחיבורי אירועים בתוספת מיקרוסרוויס מותאם אישית ללוגיקה עסקית. מידע נוסף בתיעוד Photon Chat.
לפרויקטים חוצי פלטפורמות (PC + נייד + קונסולה), תמיכה ב-OpenID Connect חשובה לאימות אחיד. הגרף החברתי (חברים, חסימות) מיושם בדרך כלל דרך טבלה נפרדת עם FK בהתייחסות עצמית ואינדקס על (user_id, friend_id, status)—בלעדיו, השאילתה "האם מישהו מהחברים שלי מקוון" לרשימה של 500+ אנשים גורמת לסריקה מלאה.
התראות Push להודעות מחוץ למשחק: Firebase Cloud Messaging לאנדרואיד/iOS, WNS ל-Windows. אינטגרציה דרך תור כך שתעבורת התראות בשיא לא חוסמת את ה-API הראשי.
שלבי העבודה למודול
ראשית, אנחנו מנתחים את הדרישות: סוגי ערוצים, מספר משתמשים בו-זמנית מקסימלי, דרישות היסטוריה, צורך בניהול תוכן, פלטפורמות. בשלב זה, אנחנו קובעים אם Photon Chat מוכן לשימוש מספיק או שצריך backend מותאם אישית.
לאחר מכן אנחנו מתכננים את סכימת הנתונים: טבלאות chat_rooms, chat_messages, chat_members, אינדקסים, מדיניות TTL להודעות ישנות. במקביל, אנחנו מתכננים את הארכיטקטורה של שכבת זמן אמת.
הפיתוח מתקדם בצורה איטרטיבית: תחילה החלפת הודעות בסיסית, אחר כך היסטוריה ופגינציה, ולבסוף תפקידים וניהול תוכן. כל שלב נסגר עם בדיקות אינטגרציה על סביבת Photon אמיתית.
בדיקות עומס הן שלב נפרד. אנחנו מדמים שיא של משתמשים בו-זמנית באמצעות Photon Load Balancer בתוספת בוטים מותאמים אישית על מופעי Unity ללא ממשק גרפי.
| היקף המשימה | לוח זמנים משוער |
|---|---|
| צ'אט בסיסי (ערוץ יחיד, ללא היסטוריה) | 1–2 שבועות |
| צ'אט עם היסטוריה + הודעות פרטיות | 3–4 שבועות |
| מודול חברתי מלא (חברים, קבוצות, התראות) | 6–10 שבועות |
| שרת מותאם אישית + ניהול תוכן + אנליטיקה | 10–16 שבועות |
העלות מחושבת באופן אישי לאחר ניתוח הדרישות והארכיטקטורה הנוכחית של הפרויקט. מוכנים לדון בפרויקט שלכם? צרו קשר—נעריך לוחות זמנים ועלות לפיתוח צ'אט מוכן לשימוש.
טעויות נפוצות ביישום עצמי
אחסון user_id רק בצד הלקוח—השרת חייב לאמת זהות דרך טוקן, אחרת כל חבילה יכולה להיות מזויפת. אי-יישום הגבלת קצב בצד השרת—10 הודעות בשנייה מלקוח אחד יכולות להפיל ערוץ. שימוש בשאילתת DB סינכרונית לכל הודעה נכנסת במקום אצווה—ב-1000 הודעות/שנייה, זה 1000 INSERT/s, מה שהורג את Postgres ללא connection pooling ו-bulk inserts. שכחת ON DELETE CASCADE בטבלאות חברים בעת מחיקת חדר—משאירה רשומות יתומות שצצות רק במהלך ביקורות.
הזמינו פיתוח צ'אט—קבלו פתרון מוכן עם תיעוד ותמיכה. אנחנו מבטיחים יציבות תחת עומס ותהליך שקוף.





