שקלו סמינר מקוון עם 500 משתתפים שבו המארח מאשר אישית כל משתתף. ללא חדר המתנה, כל אחד יכול להתחבר ולפרסם תוכן, מה שפוגע בסודיות. הפתרון שלנו: חדר המתנה הבנוי על LiveKit עם בקרת גישה גמישה. יישמנו חדרים כאלה עבור טלרפואה, בתי ספר מקוונים וסמינרים מקוונים ארגוניים — בכל מקום שבו בקרת גישה היא קריטית. החיסכון בתשתית יכול להגיע ל-40–60% בהשוואה לשירותי ענן, וההשקעה בפיתוח מחזירה את עצמה תוך 2–3 חודשים, וחוסכת מעל $10,000 בשנה עבור פריסות טיפוסיות.
הלובי הווירטואלי מאפשר למארח לראות בקשות כניסה ולהחליט אם לאשר או לדחות. המשתתף רואה מסך המתנה עם טיימר והתראות. הליבה היא אסימוני LiveKit עם הרשאות מוגבלות. רקורד שלנו: 7+ שנים ב-WebRTC, מעל 30 פרויקטים עם LiveKit, כולל בדיקות עומס עד 1000 משתתפים בעומס CPU של 95% (אחזור p99 מתחת ל-200 ms). 90% מהמשתתפים מאושרים תוך שנייה אחת.
כיצד פועלת בקרת הגישה ב-LiveKit
LiveKit מאפשר לשנות הרשאות משתתף תוך כדי תנועה באמצעות Access Token ו-API updateParticipant. משתתף בלובי מקבל אסימון עם canPublish: false ו-canSubscribe: false. כאשר המארח לוחץ על "אשר", השרת מעלה את ההרשאות — והמשתתף מקבל אוטומטית גישה מלאה. הכל קורה תוך אלפיות שנייה, כפי שמאושר על ידי תיעוד LiveKit.
אסימון למשתתף בלובי
// Токен для участника лобби — только наблюдатель
function generateLobbyToken(roomName: string, userId: string, displayName: string): string {
const at = new AccessToken(
process.env.LIVEKIT_API_KEY!,
process.env.LIVEKIT_API_SECRET!,
{
identity: `lobby-${userId}`,
name: displayName
}
);
at.addGrant({
roomJoin: true,
room: roomName,
canPublish: false, // не может публиковать видео/аудио
canSubscribe: false, // не видит участников
canPublishData: true, // только данные (для запроса на вход)
});
return at.toJwt();
} העלאת הרשאות בעת אישור
// Впустить участника — повысить права
async function admitParticipant(roomName: string, lobbyIdentity: string): Promise<void> {
await svc.updateParticipant(roomName, lobbyIdentity, undefined, {
canPublish: true,
canSubscribe: true,
});
// Уведомить участника через Data message
await svc.sendData(
roomName,
Buffer.from(JSON.stringify({ type: 'admitted' })),
DataPacket_Kind.RELIABLE,
[lobbyIdentity]
);
} מדוע פתרון מותאם אישית על פני ענן?
השוואת היישום שלנו עם חדר ההמתנה של LiveKit Cloud. הגישה המותאמת אישית נותנת שליטה מלאה על לוגיקת האישור והעיצוב, ומפחיתה עלויות בעומסים גבוהים — חיסכון של עד 40% ברוחב פס. הפתרון שלנו מעבד אישורים פי 2.5 מהר יותר מ-LiveKit Cloud עם אחזור p99 מתחת ל-200 ms לעומת ~500 ms.
| קריטריון | LiveKit Cloud | פתרון מותאם אישית בצד השרת |
|---|---|---|
| ניהול אסימונים | רק דרך API בענן | שליטה מלאה, מפתחות משלך ו-RBAC |
| מסך משתתף | תבנית (לא ניתנת להתאמה אישית) | עיצוב מותאם, לוגו, טיימר |
| לוגיקת אישור | פשוטה (אשר/דחה) | תרחישים מורכבים: תור, מיתון, אישור אוטומטי |
| אחזור אישור (p99) | ~500 ms | <200 ms (פי 2.5 מהר יותר) |
| מודל חיוב | חיוב לדקה | פיתוח קבוע, חוסך מעל $10k לשנה |
יישמנו את האפשרות השנייה עבור סמינר מקוון גדול עם 500+ משתתפים. עומס השרת נשאר יציב, אחזור האישור מתחת ל-200 ms. זמן עיבוד בקשות בשרת — מתחת ל-50 ms.
מה כלול בתצורת אסימונים והרשאות?
בעת תכנון מערכת ההרשאות, חשוב לשקול מודל תפקידים: משתתף, מוון, מארח. עבור כל תפקיד נוצר אסימון נפרד עם סט הרשאות. טעויות יישום טיפוסיות:
- העברת האסימון המלא ללקוח — האסימון חייב להיות חתום על השרת, לא נוצר על הלקוח.
- שכחת עדכון הרשאות בעת ניתוק — אם משתתף מתנתק ומתחבר מחדש, יש לאמת את האסימון מחדש.
- התעלמות מ-
// Токен для участника лобби — только наблюдатель function generateLobbyToken(roomName: string, userId: string, displayName: string): string { const at = new AccessToken( process.env.LIVEKIT_API_KEY!, process.env.LIVEKIT_API_SECRET!, { identity: `lobby-${userId}`, name: displayName } ); at.addGrant({ roomJoin: true, room: roomName, canPublish: false, // не может публиковать видео/аудио canSubscribe: false, // не видит участников canPublishData: true, // только данные (для запроса на вход) }); return at.toJwt(); }— בלעדיו, המשתתף לא יכול לשלוח בקשת כניסה.
שגיאות אלה מובילות לפרצות או תקלה בלובי. אנו מונעים אותן במהלך בדיקת קוד ובדיקות עומס.
מלכודות נפוצות וכיצד להימנע מהן
-
יצירת אסימון על הלקוח: תמיד צרו אסימונים בצד השרת באמצעות ספריית
// Впустить участника — повысить права async function admitParticipant(roomName: string, lobbyIdentity: string): Promise<void> { await svc.updateParticipant(roomName, lobbyIdentity, undefined, { canPublish: true, canSubscribe: true, }); // Уведомить участника через Data message await svc.sendData( roomName, Buffer.from(JSON.stringify({ type: 'admitted' })), DataPacket_Kind.RELIABLE, [lobbyIdentity] ); }. - תפוגת אסימון: הגדירו אורך חיים סביר לאסימון (ברירת מחדל שעה) ורעננו במידת הצורך.
-
ביטול גישה: השתמשו ב-API
canPublishDataכדי להסיר משתתף מיד. - רישום ביקורת: תעדו את כל שינויי ההרשאות לצורך עמידה בדרישות אבטחה.
אסימונים נוצרים על השרת באמצעות ספריית @livekit/protocol. אנו מגדירים אורך חיים לאסימון (ברירת מחדל שעה) והרשאות תפקיד. במידת הצורך, ניתן לבטל את האסימון דרך API removeParticipant. כל שינויי ההרשאות מתועדים לצורך ביקורת.
כיצד אנו מיישמים את חדר ההמתנה
תהליך היישום מורכב ממספר שלבים:
- ניתוח דרישות — הגדרת מודל התפקידים (משתתף, מוון, מארח) ותרחישי אישור.
- עיצוב אסימונים — יצירת אסימונים עם ההרשאות הנדרשות (canPublish, canSubscribe, canPublishData).
- פיתוח לקוח — רכיבי React למסך ההמתנה ולפאנל המארח.
- הגדרת שרת — פריסת LiveKit (Self-Hosted או Cloud) ו-API לאישור/דחייה.
- בדיקות — בדיקות יחידה, בדיקות עומס עד 1000 משתתפים, בדיקת ביצועים בעומס CPU של 95%.
- תיעוד ומסירה — תיעוד התקנה מלא, הדרכת צוות.
בנוסף, אנו מציעים השוואת אפשרויות פריסה:
| אפשרות | Self-Hosted | LiveKit Cloud |
|---|---|---|
| שליטה בנתונים | מלאה | נתונים עוברים דרך הענן |
| עלות | השכרת שרת קבועה ($50–200/חודש) | חיוב לדקה ורוחב פס |
| ביצועים | תלוי בשרת | SLA מובטח |
| מורכבות הגדרה | גבוהה יותר (נדרש DevOps) | נמוכה יותר (תצורת UI) |
הבחירה תלויה בדרישות האבטחה והתקציב שלכם. נעזור לכם להחליט.
ציר זמן
חדר המתנה בסיסי עם מסך משתתף ופאנל מארח — 1–2 ימים. אם נדרשת אינטגרציה עם מערכת האימות שלכם או לוגיקה מורכבת — עד 5 ימים. אנו מעריכים את הפרויקט שלכם תוך 24 שעות. צרו קשר לייעוץ — נעזור לבחור באפשרות האופטימלית. הזמינו פיתוח חדר המתנה סוהר וקבלו פתרון מוכן עם אחריות ל-6 חודשים.
קבלו ייעוץ לפרויקט שלכם: נעריך את הארכיטקטורה שלכם ונציע פתרון.







