בלוג

למה WordPress לא יכול להחזיק websocket, ומה עושים במקום

· Andrij Tkachenko · דקת קריאה אחת

חלון של אתר על השרת שלו, מחובר בקו אחד לענן שמחזיק את החיבורים החיים של חמישה חלונות דפדפן

במוקדם או במאוחר, אתר WordPress רוצה שמשהו יקרה בזמן אמת: הודעה חדשה שמופיעה בלי לרענן את הדף, התראה ברגע שנכנסת הזמנה, מונה של מי מחובר עכשיו, שיחה שמצלצלת. הכלי לזה בווב הוא websocket, חיבור בין הדפדפן לשרת שנשאר פתוח, כך שהשרת יכול לשלוח ברגע שמשהו קורה.

ואז מגיעה ההפתעה: ל-WordPress אין שרת websocket, והאחסון שהוא רץ עליו לא יכול להחזיק אחד כזה. הפוסט הזה מסביר למה, מה אתרים עושים בדרך כלל בעניין, ומה זה עולה להריץ שרת websocket משלכם.

WordPress עונה לבקשה ומסיים

כל דף של WordPress, כל קריאה ל-REST API וכל בקשת admin-ajax עובדים באותה דרך. שרת הווב מעביר את הבקשה ל-PHP, ו-PHP טוען את WordPress עם התוספים וערכת העיצוב, מחשב את התשובה, שולח אותה ומסיים. הבקשה הבאה מתחילה שוב מאפס.

המודל הזה הוא הסיבה ש-WordPress רץ כמעט בכל מקום. הוא גם הסיבה שהוא לא יכול להחזיק websocket. websocket הוא לא בקשה אחת, אלא חיבור שנשאר פתוח כל עוד הדף פתוח, לעתים קרובות במשך שעות. כדי להחזיק אותו צריך תהליך PHP לכל דף פתוח, שרוב הזמן לא עושה כלום, ואחסון נותן לאתר רק מספר קטן של תהליכי PHP, מספיק לבקשות שמסתיימות בשבריר שנייה. קומץ מבקרים עם דף פתוח היו תופסים את כולם, והאתר היה מפסיק לענות לכל השאר.

ספקי אחסון מגינים על עצמם מפני זה. הם עוצרים בקשות שרצות זמן רב מדי, לרוב אחרי 30 עד 60 שניות, וברוב החבילות הם לא מאפשרים לאתר להפעיל תהליך משלו ברקע או לפתוח לו פורט. גם במקום שבו ספק האחסון מאפשר זאת, השרת שעומד לפני PHP, וכל פרוקסי שעומד לפני השרת, צריכים להיות מוגדרים כך שיעבירו websocket.

Polling: לשאול שוב ושוב

הדרך המקובלת לעקוף את זה היא polling. הדף שואל את השרת כל כמה שניות: "יש משהו חדש?" ברוב הפעמים התשובה היא לא.

כל שאלה כזו היא בקשת WordPress שלמה: PHP מתחיל לרוץ, טוען את WordPress ואת התוספים שלו, שולח שאילתות למסד הנתונים ועונה. עם 50 מבקרים בדף ששואל כל 5 שניות, אלה 10 בקשות WordPress מלאות בשנייה, בכל שנייה, ורוב הזמן לשווא. שואלים לעתים רחוקות יותר, והאתר מרגיש איטי, עם הודעה שלוקח לה חצי דקה להופיע. שואלים לעתים קרובות יותר, והאחסון מתחיל להתקשות, או שולח אזהרה על שימוש במשאבים.

ל-WordPress יש גרסה משלו לזה, ה-Heartbeat API, ששואל כל 15 עד 60 שניות. הוא מתאים לשמירת טיוטות ולהצגה של מי עורך פוסט. לצ׳אט או לשיחה הוא רחוק מלהיות מהיר מספיק.

Long polling ו-server-sent events, שבהם השרת מחזיק את הבקשה פתוחה עד שמשהו קורה, נראים כמו פתרון. ב-WordPress הם לא: כל בקשה שממתינה תופסת תהליך PHP, וזה נתקל ישר באותה מגבלה כמו websocket.

שרת websocket משלכם

הפתרון האמיתי הוא שרת שבנוי להחזיק הרבה חיבורים פתוחים, לצד WordPress ולא בתוכו. צוותים רבים בונים כזה. מה זה דורש:

  • שרת משלו, בדרך כלל שרת וירטואלי קטן שמריץ Node.js או סביבת ריצה אחרת שנבנתה לחיבורים ארוכים, עם עדכונים וניטור משלו.
  • תעודה ופרוקסי, כדי שהדפדפן יוכל להתחבר ב-wss:// בדומיין שלכם.
  • היכרות עם המשתמשים שלכם. שרת ה-websocket לא רואה את ההתחברות ל-WordPress, ולכן האתר שלכם צריך לתת לכל דף טוקן חתום, והשרת צריך לבדוק אותו ולהחליט מי רשאי להצטרף לאיזה ערוץ.
  • דרך של WordPress לשלוח. כשמשהו קורה ב-WordPress, hook צריך לעדכן את שרת ה-websocket, שאז שולח את זה לדפדפנים הנכונים.
  • יותר מאחד, ככל שאתם גדלים. שרת אחד הוא נקודה אחת שבה כל החיבורים יכולים ליפול. שניים או יותר צריכים דרך לחלוק הודעות ביניהם, והדפים צריכים להתחבר מחדש בצורה חלקה כששרת מופעל מחדש.

שום דבר מזה אינו אקזוטי, אבל זו מערכת שנייה שצריך להמשיך להפעיל לצד WordPress, כל עוד יש באתר תכונות חיות. לשיחות זו רק ההתחלה: שיחה צריכה גם שרתי STUN ו-TURN, ושיחות קבוצתיות צריכות שרתי מדיה, כפי שמוסבר בפוסט שלנו על איך שיחות וידאו קבוצתיות עובדות.

או לתת לענן לזמן אמת להחזיק את החיבורים

הדרך האחרת היא שירות מנוהל לזמן אמת. הדפדפנים שומרים את החיבורים הפתוחים שלהם מול השירות, לא מול האחסון שלכם. כשמשהו קורה באתר שלכם, WordPress שולח בקשה קצרה אחת לשירות, והשירות מעביר את העדכון לכל דף שאמור לקבל אותו. האחסון שלכם רק עונה לבקשות רגילות, כמו תמיד.

WordPress נשאר המקום שבו הנתונים שלכם נמצאים. השירות רק מעביר אירועים מהאתר לדפים ובין דפים, כך ששום דבר לא משתנה באופן שבו האתר שלכם שומר פוסטים, משתמשים או הזמנות.

איך WordPlus Cloud עושה את זה ב-WordPress

WordPlus Cloud for WordPress הוא הענן הזה, לכל תוסף באתר WordPress:

  • אין מה לתחזק. שרתי הזמן האמת, ממסרי השיחות, שרתי המדיה והבינה המלאכותית רצים בענן. האתר שלכם צריך רק מנוי, שמתומחר לפי אתר, ואין מגבלה על מספר המשתמשים או ההודעות.
  • כל תוסף באתר יכול להשתמש בו. Better Messages ו-Live Stream משתמשים בו מהרגע הראשון. תוספים שנבנו עבור פרוטוקול Pusher מתחברים עם השרתים שלנו והמפתחות של האתר שלכם, וכל תוסף, ערכת עיצוב או קוד מותאם אחר מתחברים דרך ה-API למפתחים שלנו.
  • הנתונים שלכם נשארים ב-WordPress. שיחות, משתמשים וקבצים נשארים במסד הנתונים שלכם. ההודעות עוברות דרך הענן מוצפנות במפתח שנמצא בידי האתר שלכם, כך שאנחנו מעבירים אותן בלי לקרוא אותן.
  • יותר מ-websocket. אותו מנוי מביא שיחות שתמיד מתחברות, שיחות קבוצתיות, התראות פוש לדפדפנים ולטלפונים, שידור חי, אפליקציות מובייל משלכם ובינה מלאכותית, על אותו חיבור.

כל דף שומר חיבור אחד, שכל התוספים באתר חולקים, והחיבור עובר לשרת אחר בלי ניתוק כששרת מופעל מחדש. האחסון שלכם חוזר לעשות את מה שהוא עושה טוב: לענות לבקשות.

הכירו את WordPlus Cloud for WordPress, או ראו את המחירים למספר האתרים שלכם.