במדריך הזה מוסבר איך ליצור שירות צ'אט בזמן אמת עם כמה חדרים באמצעות WebSockets עם חיבור קבוע לתקשורת דו-כיוונית. באמצעות WebSockets, גם הלקוח וגם השרת יכולים לשלוח הודעות זה לזה בלי שהלקוח יבדוק את השרת כדי לראות אם יש עדכונים.
אפשר להגדיר את Cloud Run כך שישתמש בזיקה לסשן, אבל הזיקה הזו היא במקרה הטוב, כלומר כל בקשה חדשה עדיין יכולה להיות מנותבת למופע אחר. כתוצאה מכך, צריך לסנכרן את ההודעות של המשתמשים בשירות הצ'אט בכל המקרים, ולא רק בין הלקוחות שמחוברים למקרה אחד.
תכנון שירות צ'אט בזמן אמת
שירות הצ'אט לדוגמה הזה משתמש במכונה של Memorystore for Redis כדי לאחסן ולסנכרן את הודעות המשתמשים בכל המכונות. Redis משתמש במנגנון Pub/Sub (לא לבלבל עם המוצר Cloud Pub/Sub) כדי לדחוף נתונים ללקוחות מנויים שמחוברים לכל מופע, וכך למנוע סקר HTTP לגבי עדכונים.
עם זאת, גם עם עדכונים בדחיפה, כל מופע שמופעל יקבל רק הודעות חדשות שנדחפות למאגר. כדי לטעון הודעות קודמות, צריך לאחסן את היסטוריית ההודעות ולשלוף אותה מפתרון אחסון קבוע. בדוגמה הזו נעשה שימוש בפונקציונליות המקובלת של Redis בתור מאגר אובייקטים כדי לשמור במטמון את היסטוריית ההודעות ולאחזר אותה.
מכונת Redis מוגנת מפני האינטרנט באמצעות כתובות IP פרטיות, והגישה אליה מבוקרת ומוגבלת לשירותים שפועלים באותה רשת וירטואלית פרטית (VPN) כמו מכונת Redis. מומלץ להשתמש ביציאה ישירה מ-VPC.
מגבלות
במדריך הזה לא מוצג אימות של משתמשי קצה או שמירת נתוני סשן במטמון. מידע נוסף על אימות משתמשי קצה זמין במדריך בנושא אימות משתמשי קצה ב-Cloud Run.
במדריך הזה לא מוטמע מסד נתונים כמו Firestore לאחסון ולשליפה ללא הגבלה של היסטוריית ההודעות בצ'אט.
כדי שהשירות לדוגמה הזה יהיה מוכן להפקה, צריך להוסיף לו עוד רכיבים. מומלץ להשתמש במופע Redis במסלול הרגיל כדי לספק זמינות גבוהה באמצעות שכפול ומעבר אוטומטי לגיבוי במקרה של כשל.
מטרות
כתיבה, פיתוח ופריסה של שירות Cloud Run שמשתמש ב-WebSockets.
מתחברים למכונת Memorystore for Redis כדי לפרסם ולהירשם להודעות חדשות במכונות.
מחברים את שירות Cloud Run ל-Memorystore באמצעות תעבורת נתונים יוצאת (egress) ישירה של VPC.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי ליצור הערכת עלויות בהתאם לשימוש החזוי, אתם יכולים להשתמש במחשבון התמחור.
לפני שמתחילים
- נכנסים לחשבון Google Cloud . אנחנו ממליצים למשתמשים חדשים ב- Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
מפעילים את ממשקי ה-API של Cloud Run, Memorystore for Redis, Artifact Registry ו-Cloud Build, אם הם עדיין לא מופעלים.
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, נדרשת ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים- מתקינים ומפעילים את ה-CLI של gcloud.
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות להשלמת המדריך, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:
- קריאה ב-Artifact Registry (
roles/artifactregistry.reader) - עריכה ב-Cloud Build (
roles/cloudbuild.builds.editor) - אדמין ב-Cloud Memorystore Redis (
roles/redis.admin) - אדמין ב-Cloud Run (
roles/run.admin) - יצירת חשבונות שירות (
roles/iam.serviceAccountCreator) - אדמין IAM בפרויקט (
roles/resourcemanager.projectIamAdmin) - אדמין בחשבון שירות (
roles/iam.serviceAccountAdmin) - צרכן שימוש בשירות (
roles/serviceusage.serviceUsageConsumer)
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
הגדרת ברירות מחדל ב-gcloud
כדי להגדיר את gcloud עם ערכי ברירת מחדל לשירות Cloud Run:
מגדירים את פרויקט ברירת המחדל:
gcloud config set project PROJECT_ID
מחליפים את PROJECT_ID בשם הפרויקט שיצרתם לצורך המדריך הזה.
מגדירים את gcloud לאזור שבחרתם:
gcloud config set run/region REGION
מחליפים את REGION באזור נתמך ב-Cloud Run לבחירתכם.
מיקומי Cloud Run
Cloud Run הוא שירות אזורי, כלומר התשתית שמריצה את שירותי Cloud Run ממוקמת באזור ספציפי ומנוהלת על ידי Google כך שתהיה זמינה באופן יתירתי בכל התחומים באותו אזור.
הקריטריונים העיקריים לבחירת האזור שבו יפעלו שירותי Cloud Run הם זמן האחזור, הזמינות או העמידות שנדרשים לכם.
בדרך כלל אפשר לבחור את האזור הקרוב ביותר למשתמשים, אבל כדאי לקחת בחשבון את המיקום של מוצרים Google Cloud
אחרים שבהם נעשה שימוש בשירות Cloud Run.
השימוש במוצרים של Google Cloud Google ביחד בכמה מיקומים יכול להשפיע על זמן האחזור ועל העלות של השירות.
Cloud Run זמין באזורים הבאים:
בכפוף לתמחור ברמה 1
asia-east1(טייוואן)asia-northeast1(טוקיו)-
asia-northeast2(אוסקה) asia-south1(מומבאי, הודו)-
asia-southeast3(בנגקוק) europe-north1(פינלנד)רמה נמוכה של CO2
europe-north2(שטוקהולם)רמה נמוכה של CO2
europe-southwest1(מדריד)רמה נמוכה של CO2
europe-west1(בלגיה)רמה נמוכה של CO2
europe-west4(הולנד)רמה נמוכה של CO2
europe-west8(מילאנו)רמה נמוכה של CO2
europe-west9(פריז)רמה נמוכה של CO2
me-west1(תל אביב)northamerica-south1(מקסיקו)us-central1(אייווה)רמה נמוכה של CO2
us-east1(דרום קרוליינה)-
us-east4(צפון וירג'יניה) us-east5(Columbus)us-south1(דאלאס)רמה נמוכה של CO2
us-west1(אורגון)רמה נמוכה של CO2
בכפוף לתמחור ברמה 2
africa-south1(יוהנסבורג)asia-east2(הונג קונג)asia-northeast3(סיאול, קוריאה הדרומית)asia-southeast1(סינגפור)asia-southeast2(ג'קרטה)asia-south2(דלהי, הודו)-
australia-southeast1(סידני) -
australia-southeast2(מלבורן) europe-central2(ורשה, פולין)רמה נמוכה של CO2
-
europe-west10(ברלין) europe-west12(טורינו)רמה נמוכה של CO2
europe-west2(לונדון, בריטניה)רמה נמוכה של CO2
-
europe-west3(פרנקפורט, גרמניה) europe-west6(ציריך, שווייץ)רמה נמוכה של CO2
-
me-central1(דוחה) -
me-central2(דמאם) northamerica-northeast1(מונטריאול)רמה נמוכה של CO2
northamerica-northeast2(טורונטו)רמה נמוכה של CO2
southamerica-east1(סאו פאולו, ברזיל)רמה נמוכה של CO2
southamerica-west1(סנטיאגו, צ'ילה)רמה נמוכה של CO2
-
us-west2(לוס אנג'לס) -
us-west3(סולט לייק סיטי) -
us-west4(לאס וגאס)
אם כבר יצרתם שירות Cloud Run, תוכלו לראות את האזור בלוח הבקרה של Cloud Run בGoogle Cloud מסוף.
אחזור של דוגמת הקוד
כדי לאחזר את דוגמת קוד לשימוש:
משכפלים את המאגר לדוגמה ומעבירים אותו למכונה המקומית:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
אפשרות נוספת היא להוריד את קובץ הדוגמה כקובץ ZIP ולחלץ אותו.
עוברים לספרייה שמכילה את הקוד לדוגמה של Cloud Run:
Node.js
cd nodejs-docs-samples/run/websockets/
הסבר על קוד WebSockets
Socket.io היא ספרייה שמאפשרת תקשורת דו-כיוונית בזמן אמת בין הדפדפן לבין השרת. למרות ש-Socket.io הוא לא הטמעה של WebSocket, הוא עוטף את הפונקציונליות כדי לספק API פשוט יותר למספר פרוטוקולי תקשורת עם תכונות נוספות כמו מהימנות משופרת, חיבור מחדש אוטומטי ושידור לכל הלקוחות או לקבוצת משנה שלהם.
שילוב בצד הלקוח
הלקוח יוצר מופע חדש של Socket לכל חיבור. מכיוון שהדוגמה הזו מעובדת בצד השרת, אין צורך להגדיר את כתובת ה-URL של השרת. מופע של socket יכול לשדר אירועים ולהאזין להם.
שילוב בצד השרת
בצד השרת, שרת Socket.io מאותחל ומצורף לשרת ה-HTTP. בדומה לצד הלקוח, אחרי ששרת Socket.io יוצר חיבור ללקוח, נוצר מופע של Socket לכל חיבור, שאפשר להשתמש בו כדי לשלוח הודעות ולהאזין להן. בנוסף, Socket.io מספק ממשק ליצירת 'חדרים' או ערוץ שרירותי שסוקטים יכולים להצטרף אליו ולצאת ממנו.
בנוסף, Socket.io מספק מתאם Redis לשידור אירועים לכל הלקוחות, בלי קשר לשרת שמשרת את הסוקט. Socket.io משתמשת רק במנגנון Pub/Sub של Redis ולא מאחסנת נתונים.
המתאם של Redis ב-Socket.io יכול לעשות שימוש חוזר בלקוח Redis שמשמש לאחסון היסטוריית ההודעות בחדר. כל קונטיינר ייצור חיבור למופע Redis, ו-Cloud Run יכול ליצור מספר גדול של מופעים. המספר הזה נמוך בהרבה מ-65,000 החיבורים ש-Redis יכול לתמוך בהם.
חיבור מחדש
הזמן הקצוב המקסימלי ב-Cloud Run הוא 60 דקות. לכן צריך להוסיף לוגיקה של חיבור מחדש למקרה של פסק זמן. במקרים מסוימים, Socket.io מנסה להתחבר מחדש באופן אוטומטי אחרי אירועים של ניתוק או שגיאת חיבור. אין ערובה לכך שהלקוח יתחבר מחדש לאותו מופע.
המופעים יישארו פעילים אם יש חיבור פעיל עד שכל הבקשות ייסגרו או יגיעו לזמן קצוב לתפוגה. גם אם משתמשים בהעדפת סשן ב-Cloud Run, יכול להיות שבקשות חדשות יאזנו את העומס על קונטיינרים פעילים, וכך יאפשרו לקונטיינרים להקטין את קנה המידה. אם אתם חוששים ממספר גדול של מאגרי תגים שנשמרים אחרי עלייה חדה בתנועת הגולשים, אתם יכולים להקטין את ערך הזמן הקצוב לתפוגה המקסימלי, כדי שמערכת תנקה את השקעים הלא בשימוש בתדירות גבוהה יותר.
משלוח השירות
יוצרים מכונה של Memorystore for Redis:
gcloud redis instances create INSTANCE_ID --size=1 --region=REGION
מחליפים את מה שכתוב בשדות הבאים:
- INSTANCE_ID: השם של המכונה, לדוגמה,
my-redis-instance. - REGION_ID: האזור של כל המשאבים והשירותים – לדוגמה,
europe-west1.
למופע יוקצה באופן אוטומטי טווח כתובות IP מתוך טווח רשת השירות שמוגדר כברירת מחדל. במדריך הזה נעשה שימוש בזיכרון של 1GB למטמון המקומי של ההודעות במכונת Redis. מידע נוסף על קביעת הגודל ההתחלתי של מופע Memorystore לתרחיש השימוש שלכם
- INSTANCE_ID: השם של המכונה, לדוגמה,
מגדירים משתנה סביבה עם כתובת ה-IP של הרשת המורשית של מופע Redis:
export REDISHOST=$(gcloud redis instances describe INSTANCE_ID --region REGION --format "value(host)")
יוצרים חשבון שירות שישמש כזהות בשירות. כברירת מחדל, אין לו הרשאות מלבד חברות בפרויקט.
gcloud iam service-accounts create chat-identity gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:chat-identity@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/serviceusage.serviceUsageConsumer
מריצים את הפקודה הבאה כדי למצוא את השם של רשת ה-VPC עם הרשאת הגישה למופע Redis:
gcloud redis instances describe INSTANCE_ID --region REGION --format "value(authorizedNetwork)"
מחליפים את מה שכתוב בשדות הבאים:
- INSTANCE_ID: השם של המכונה, לדוגמה,
my-redis-instance. - REGION_ID: האזור של כל המשאבים והשירותים – לדוגמה,
europe-west1.
רושמים את השם של רשת ה-VPC.
- INSTANCE_ID: השם של המכונה, לדוגמה,
יוצרים את קובץ האימג' של הקונטיינר ופורסים אותו ב-Cloud Run:
gcloud run deploy chat-app --source . \ --allow-unauthenticated \ --timeout 3600 \ --service-account chat-identity \ --network NETWORK \ --subnet SUBNET \ --update-env-vars REDISHOST=$REDISHOST
מחליפים את מה שכתוב בשדות הבאים:
- NETWORK הוא השם של רשת ה-VPC המורשית שאליה מחובר מופע Redis.
- SUBNET הוא השם של רשת המשנה. רשת המשנה צריכה להיות
/26או גדולה יותר. תעבורת נתונים יוצאת (egress) ישירה מ-VPC תומכת בטווחים של כתובות IPv4 RFC 1918, RFC 6598 ו-Class E.
משיבים
yלכל הנחיות להתקנת ממשקי API נדרשים. צריך לעשות את זה רק פעם אחת לכל פרויקט. אם לא הגדרתם ערכי ברירת מחדל לפלטפורמה ולאזור כמו שמתואר בדף ההגדרה, תצטרכו להזין אותם בתשובה להנחיות אחרות. מידע נוסף על פריסה מקוד מקור
ניסיון השירות
כדי לנסות את השירות המלא:
בדפדפן, עוברים לכתובת ה-URL שמופיעה בשלב הפריסה.
כדי להיכנס, צריך להוסיף את השם שלכם וחדר צ'אט.
שולחים הודעה לחדר.
אם תבחרו להמשיך לפתח את השירותים האלה, חשוב לזכור שיש להם גישה מוגבלת לניהול זהויות והרשאות גישה (IAM) לשאר השירותים של Google Cloud , ויהיה צורך להקצות להם תפקידי IAM נוספים כדי לגשת לשירותים רבים אחרים.
הסרת המשאבים
כדי להימנע מחיובים נוספים בחשבון Google Cloud , מוחקים את כל המשאבים שהצבתם באמצעות המדריך הזה.
מחיקת הפרויקט
אם יצרתם פרויקט חדש בשביל המדריך הזה, מוחקים את הפרויקט. אם השתמשתם בפרויקט קיים ואתם רוצים לשמור אותו בלי השינויים שהוספתם במדריך הזה, תצטרכו למחוק את המשאבים שיצרתם לצורך המדריך.
הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך.
כדי למחוק את הפרויקט:
- במסוף Google Cloud , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
מחיקת משאבים של מדריך
מוחקים את שירות Cloud Run שפרסתם במדריך הזה. שירותי Cloud Run לא צוברים עלויות עד שהם מקבלים בקשות.
כדי למחוק את שירות Cloud Run, מריצים את הפקודה הבאה:
gcloud run services delete SERVICE-NAME
מחליפים את SERVICE-NAME בשם השירות.
אפשר גם למחוק שירותים של Cloud Run מGoogle Cloud המסוף.
מסירים את הגדרת ברירת המחדל של האזור
gcloudשהוספתם במהלך ההגדרה של המדריך:gcloud config unset run/regionמסירים את הגדרת הפרויקט:
gcloud config unset projectמחיקה של Google Cloud משאבים אחרים שנוצרו במדריך הזה:
- מחיקת קובץ האימג' של הקונטיינר של השירות בשם
gcr.io/PROJECT_ID/chat-appמ-Artifact Registry - מחיקת חשבון השירות
chat-identity@PROJECT_ID.iam.gserviceaccount.com - מחיקת מכונת Memorystore for Redis
- מחיקת קובץ האימג' של הקונטיינר של השירות בשם
המאמרים הבאים
מידע נוסף על אופן הפעולה של Socket.io ועל שימוש מתקדם יותר.
מידע נוסף על Direct VPC egress עם רשת VPC
כדאי לעיין בשיטות המומלצות לשימוש ב-Memorystore ובשימוש ב-WebSockets ב-Cloud Run.