איך לחבר משתמשים מאזורים שונים: שיחות שנשארות קרובות לכולם

שיחת וידאו שעובדת היטב בבדיקות יכולה להרגיש אחרת ברגע שהמשתמשים שלכם פזורים ברחבי העולם. שני אנשים בסינגפור נכנסים זה לדברי זה, שיחה קבוצתית עם מישהו בקנדה קופאת רק אצלו, ושידור חי נעצר לטעינה אצל צופים בצד השני של האוקיינוס. הקוד זהה אצל כולם. מה ששונה הוא המרחק בין כל אדם לבין השרת שהשיחה עוברת דרכו.
הפוסט הזה מסביר למה מרחק חשוב בשיחה, מה נדרש כדי לשמור כל אדם קרוב לשרת, בשיחות בין שני אנשים, בשיחות קבוצתיות ובשידורים חיים, ומה יכול להישאר במקום אחד.
למה מרחק חשוב בשיחה
אור בסיב אופטי עובר כ-200 קילומטרים במילישנייה, ומסלולים אמיתיים ארוכים מקו ישר. חבילה מסינגפור לפרנקפורט ובחזרה לוקחת כ-160 מילישניות, ומסידני לפרנקפורט ובחזרה כ-280.
שיחה בין אנשים רגישה לכך. כשמה שמישהו אומר לוקח יותר מכ-150 מילישניות להגיע לאוזן השנייה, אנשים מתחילים להיכנס זה לדברי זה ולחכות לתשובות שכבר נמצאות בדרך. הקידוד, הרשת וה-jitter buffer בכל מכשיר מוסיפים את חלקם עוד לפני שהמרחק מוסיף משהו.
שיחה שעוברת דרך שרת עוברת שני מקטעים: מהאדם הראשון לשרת, ואז מהשרת לשני. שימו את השרת בפרנקפורט, ושני אנשים בסינגפור שולחים כל אחד את הכול לאירופה ובחזרה, כך שמה שהם אומרים מגיע הרבה מעבר לגבול הנוח הזה, אף שהם גרים באותה עיר. שימו את השרת בסינגפור, ואותה שיחה לוקחת כמה מילישניות.
לכן השאלה בכל אפליקציה עם משתמשים ביותר מאזור אחד היא דרך איזה שרת עוברת כל שיחה, וכמה הוא קרוב לאנשים שבה.
שיחות בין שני אנשים
שיחה בין שני אנשים עוברת ישירות בין המכשירים שלהם כשהיא יכולה, בלי שרת באמצע. המרחק ביניהם הוא אז ההשהיה היחידה, ושום דבר לא מקצר אותו.
כשחומת אש חוסמת את הדרך הישירה, השיחה עוברת דרך ממסר TURN (הפוסט שרתי STUN ו-TURN מסביר למה). עם ממסר אחד באזור אחד, כל שיחה שעוברת דרך ממסר מגיעה לשם, כך ששני אנשים באסיה שהרשתות שלהם צריכות ממסר מדברים דרך אירופה.
הפתרון הוא ממסר בכל אזור שהמשתמשים שלכם נמצאים בו, כשכל מכשיר משתמש בממסר הקרוב אליו ביותר:
- שם אחד, שהתשובה עליו תלויה באזור. השם של הממסר מתורגם לכל מכשיר לאזור הקרוב אליו ביותר, לפי ההשהיה או לפי המקום שממנו מגיעה הבקשה. המכשיר לא צריך שום הגדרה, ואזור חדש משרת את המשתמשים שלו ברגע שהממסרים שלו עונים לשם הזה.
- פרטי גישה שכל אזור מקבל. את פרטי הגישה לממסר יוצר בדרך כלל השרת שלכם, מסוד שהוא חולק עם הממסרים. כל אזור בודק אותם באותה דרך, כך שמכשיר יכול להשתמש בכל ממסר שהוא מגיע אליו.
- הפורטים של הווב בכל אזור. פורט 3478 ב-UDP לרוב הרשתות, ו-443 עם TLS לרשתות שמאפשרות רק תעבורת ווב, עם תעודה לכל שם.
עם ממסר קרוב לכל מכשיר, שיחה דרך ממסר נשארת קרובה לשיחה הישירה, לא משנה אילו שתי מדינות היא מחברת.
שיחות קבוצתיות: שרת מדיה אחד, או אחד לכל אזור
שיחה קבוצתית רצה על שרת מדיה: כל אדם שולח אליו את הקול והתמונה שלו פעם אחת, והוא מעביר אותם לכל השאר, באיכות שכל מסך מציג (הפוסט איך שיחות וידאו קבוצתיות עובדות מסביר את זה). הדרך הפשוטה להפעיל שיחה כזו היא שרת לכל שיחה: השיחה נפתחת על שרת באזור של מי שהצטרף ראשון, וכולם מצטרפים לשרת הזה.
זה עובד כל עוד כל מי שבשיחה נמצא באותו חלק של העולם. כשיש אנשים בשתי יבשות, צד אחד רחוק מהשרת, וכל קול וכל תמונה שהוא שולח ומקבל עוברים בדרך הארוכה.
הפתרון הוא לפרוס שיחה אחת על שרתים בכמה אזורים:
- כל אדם מצטרף לשרת באזור שלו, הקרוב ביותר, ושולח אליו את הקול והתמונה שלו פעם אחת.
- השרתים מעבירים ביניהם כל זרם. תמונה עוברת בין אזורים פעם אחת לכל שרת שצריך אותה, ולא פעם אחת לכל אדם שצופה בה, ומגיעה לכל אחד מהשרת של האזור שלו.
- רק מה שצופים בו עובר. זרם שאף אחד באזור לא צופה בו לא עובר אליו, וכל אזור מקבל רק את האיכות שהאנשים בו מציגים אותו בה.
- השרתים מחזיקים שיחה אחת. מי נמצא בה, מי מדבר, מי משתף מסך ומתי היא מסתיימת זהים בכל שרת, כך שהאנשים בה רואים שיחה אחת, ולא כמה שיחות שחוברו יחד.
- קישורים בין אזורים שמחזיקים מעמד. הזרמים בין אזורים עוברים בקישורים פרטיים או במנהרות מוצפנות, וחבילות שאבדו מתבקשות מחדש לאורכם, כך שקישור בין יבשות לא הופך לתמונות קפואות.
שני אנשים בוורשה ושניים במונטריאול מדברים אז כל אחד דרך שרת קרוב אליו, ורק עותק אחד של כל זרם חוצה את האוקיינוס האטלנטי.
שידורים חיים
שידור חי הוא אותה בעיה עם שולח אחד והרבה מקבלים. המנחה שולח את התמונה לשרת קרוב אליו, וכל צופה צופה משרת באזור שלו, שמקבל את השידור פעם אחת מהשרת של המנחה ומשרת את כל מי שצופה שם. קהל שפזור בהרבה מדינות מקבל אז שירות קרוב לכל צופה, והצופים באף אזור לא מחכים לשרת בצד השני של העולם.
מה יכול להישאר באזור אחד
לא הכול צריך להיות קרוב. הודעות צ׳אט, נוכחות, חיווי הקלדה ושאר האירועים של אפליקציה הם קטנים, והודעה שמגיעה 100 מילישניות אחרי שיכלה להגיע עוברת בלי שאיש ישים לב. כשהם נשארים באזור אחד, הסדר וההיסטוריה שלהם נשארים פשוטים, וזה חשוב יותר מהמילישניות.
לכן החלוקה המקובלת היא מדיה קרוב לכל אדם, ואירועים במקום אחד.
איך לחבר משתמשים מאזורים שונים: רשימת בדיקה
- בדקו איפה המשתמשים שלכם נמצאים. המדינות שמהן הם מתקשרים אומרות לכם אילו אזורים אתם צריכים קודם.
- הציבו ממסרים בכל אחד מהאזורים האלה, מאחורי שם אחד שהתשובה עליו תלויה באזור, עם פרטי גישה שכל אזור מקבל, בפורט 443 וגם ב-3478.
- פרסו כל שיחה קבוצתית וכל שידור חי על כמה אזורים, כשכל אדם נמצא על שרת קרוב אליו וכל זרם עובר בין אזורים פעם אחת, ורק כל עוד צופים בו.
- שמרו על השיחות פעילות כששרתים מתחלפים. שרת שיוצא לתחזוקה מעביר קודם את השיחות שלו לשרת אחר, כך שאף שיחה לא מתנתקת.
- השאירו את האירועים באזור אחד אלא אם יש לאפליקציה שלכם סיבה לעשות אחרת.
אף אחד מאלה אינו עבודה קטנה: כל אזור הוא שרתים שצריך להפעיל, לעדכן, לנטר ולהגדיל, והקישורים ביניהם הם רשת בפני עצמה.
איך WordPlus Cloud מחבר את המשתמשים שלכם
WordPlus Cloud מפעיל את כל זה, כך שהאפליקציה שלכם אף פעם לא בוחרת אזור:
- הממסרים ושרתי המדיה שלנו לשיחות פועלים בגרמניה, בצרפת, בבריטניה, בפולין, בקנדה ובסינגפור, ובקרוב גם בארצות הברית, באוסטרליה, בהודו ובאיטליה. העמוד איך אנחנו מחברים את המשתמשים שלכם מציג אותם על מפה.
- כל מכשיר מגיע לאזור הקרוב אליו ביותר, דרך שם אחד שהתשובה עליו נקבעת לפי ההשהיה. שיחה בין שני אנשים עוברת ישירות בין המכשירים כשהיא יכולה, דרך הממסר הקרוב לכל אדם כשחומת אש חוסמת את זה, ודרך שרתי המדיה שלנו כשאפילו הממסרים לא מצליחים לעבור, בלי לנתק.
- כל אדם בשיחה קבוצתית או בשידור חי מצטרף לשרת מדיה באזור שלו, והשרתים שלנו מעבירים כל זרם בין אזורים בקישורים פרטיים, פעם אחת לכל שרת שצריך אותו, ורק כל עוד מישהו שם צופה בו.
- שרת שיוצא לתחזוקה מעביר קודם את השיחות שלו לשרת אחר, והאנשים בהן ממשיכים לדבר.
- הודעות ואירועים עוברים דרך שרתי זמן האמת שלנו בגרמניה, שגדלים יחד עם התעבורה. שרתי קצה באזורים נוספים בדרך, כדי לקרב גם את האירועים למשתמשים שלכם.
שיחות בין שני אנשים מוצפנות מקצה לקצה בכל נתיב, והשרת שלכם עדיין מחליט מי רשאי להתקשר למי. זה עובד באותה דרך ב-Better Messages ב-WordPress ובאפליקציות שלכם ב-Next.js, ב-Laravel, ב-Django ובסטאקים אחרים, עם ערכות ה-SDK שלנו. העמוד שיחות וידאו ושיחות קבוצתיות לאפליקציה שלכם מראה מה ערכות ה-SDK נותנות לכם.