במדריך הזה מוסבר איך להגדיר קבוצה של אפליקציות שמתקשרות ביניהן באמצעות שליחת הודעות דרך Pub/Sub, במקום באמצעות RPC סינכרוני. הפרדה בין אפליקציות מאפשרת:
- הופך את האפליקציות לחזקות יותר
- יכול לפשט את הפיתוח
לדוגמה, הצד שמתקשר (בעל האתר) לא צריך שהצד שמקבל את השיחה (המשתמש) יהיה זמין. בעל התוכן הדיגיטלי שולח הודעה ל-Pub/Sub. בעל התוכן הדיגיטלי לא צריך לדעת אילו אפליקציות של מנויים צריכות לקבל את ההודעה וכמה כאלה יש. כתוצאה מכך, אפשר להסתמך על השירות שיעביר את ההודעה לאפליקציות של מנויים כשהן זמינות.
סקירה כללית של המערכת
במדריך הזה תתחילו למלא בקשה להצטרפות לתוכנית השותפים של Google, ותשלחו את ההודעה Hello, World! לשני מנויים באמצעות תקשורת אחד לרבים, כמו שמוצג בתרשים הבא:
שתי האפליקציות של המנויים משתמשות באותו קוד, אבל מתחילות בזמנים שונים. התהליך הזה מדגים איך Pub/Sub מאפשר תקשורת אסינכרונית. כדי לבנות את המערכת הזו, צריך לבצע את השלבים הבאים:
- יוצרים חשבון שירות ב-IAM שהאפליקציות משתמשות בו לאימות.
- מגדירים הרשאות IAM.
- יוצרים נושא ומינוי ב-Pub/Sub.
- מפעילים שלוש אפליקציות עצמאיות: אפליקציה אחת של בעל תוכן דיגיטלי ושתי אפליקציות של מנויים.
לפני שמתחילים
-
התקינו את ה-CLI של Google Cloud.
-
הגדירו שה-CLI של gcloud ישתמש בזהות המאוחדת שלכם.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים Cloud de Confiance פרויקט.
תפקידים שנדרשים כדי לבחור או ליצור פרויקט
- Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
-
יוצרים Cloud de Confiance פרויקט:
gcloud projects create PROJECT_ID
מחליפים את
PROJECT_IDבשם של פרויקט Cloud de Confiance שיוצרים. -
בוחרים את הפרויקט שיצרתם: Cloud de Confiance
gcloud config set project PROJECT_ID
מחליפים את
PROJECT_IDבשם הפרויקט ב- Cloud de Confiance .
מפעילים את Pub/Sub API, אם הוא עדיין לא מופעל:
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, נדרשת ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידיםgcloud services enable pubsub.googleapis.com
-
יוצרים פרטי כניסה לאימות מקומי עבור חשבון המשתמש:
gcloud auth application-default login
אם מוחזרת שגיאת אימות ואתם משתמשים בספק זהויות חיצוני (IdP), ודאו ש נכנסתם ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
מעניקים תפקידים לחשבון המשתמש. מריצים את הפקודה הבאה לכל אחד מהתפקידים הבאים ב-IAM:
roles/pubsub.publisher, roles/pubsub.subscribergcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט. -
USER_IDENTIFIER: המזהה של חשבון המשתמש חשבון. דוגמאות מופיעות במאמר ייצוג המשתמשים במאגרי כוח עבודה בכללי מדיניות IAM. -
ROLE: תפקיד ה-IAM שאתם מקצים לחשבון המשתמש.
-
התקנת Python
במדריך הזה נעשה שימוש בספריות הלקוח של Pub/Sub, שנדרשת בהן Python בגרסה 3.7 ואילך. משלימים את ההוראות להתקנת Python.
הגדרת פרויקט Pub/Sub
כדי לנהל את זרימת ההודעות בין אפליקציות לפרסום ולאפליקציות להרשמה, צריך ליצור נושא ושני מינויים שונים.
יוצרים נושא Pub/Sub
תכין לי נושא עם המזהה hello_topic:
gcloud pubsub topics create hello_topic
יצירת מינויים ל-Pub/Sub
ליצור שני מינויים ולצרף אותם לנושא.
המינויים האלה הם מינויי StreamingPull, שהם סוג של מינויי pull.
מינוי 1
יוצרים מינוי עם המזהה sub_one ומצרפים אותו ל-hello_topic.
gcloud pubsub subscriptions create sub_one --topic=hello_topic
מינוי 2
יוצרים מינוי עם המזהה sub_two ומצרפים אותו ל-hello_topic.
gcloud pubsub subscriptions create sub_two --topic=hello_topic
יצירת מערכת של קשרים מסוג אחד לרבים
הורדה של קוד בעל האתר וקוד המנוי
מורידים את קובצי ה-Python של Pub/Sub שנדרשים למדריך הזה.
git clone https://github.com/googleapis/python-pubsub.git
לפני שממשיכים, סוגרים את כל הטרמינלים הפתוחים.
הגדרת שלושה מסופים
מפעילים טרמינל אחד לכל אפליקציה במדריך (מפרסם אחד ושני מנויים). לנוחותכם, במדריך הזה נשתמש במונחים הבאים לתיאור המסופים האלה:
- מסוף בעל התוכן הדיגיטלי
- מסוף sub_one
- מסוף sub_two
בטרמינל של המוציא לאור, יוצרים ומפעילים סביבה וירטואלית של Python בשם
pyenv-qs.Bash
python -m venv pyenv-qs source pyenv-qs/bin/activate
PowerShell
py -m venv pyenv-qs .\pyenv-qs\Scripts\activate
במסופי sub_one ו-sub_two, מריצים את הפקודה הבאה:
Bash
source pyenv-qs/bin/activate
PowerShell
.\pyenv-qs\Scripts\activate
אחרי שמריצים את פקודת ההפעלה, בשורת הפקודה מופיע הערך
(pyenv-qs) $.בטרמינל של השולח, מתקינים את ספריית הלקוח של Python ל-Pub/Sub באמצעות
pip:python -m pip install --upgrade google-cloud-pubsub
בכל שלושת הטרמינלים, מגדירים משתנה סביבה עם מזהה הפרויקט הנוכחי. הפקודה הזו ב-gcloud קובעת את מזהה הפרויקט שבחרתם ומגדירה אותו כמשתנה:
Bash
export PROJECT=`gcloud config get-value project`
PowerShell
$env:PROJECT=$(gcloud config get-value project)
בכל שלושת חלונות הטרמינל, עוברים לנתיב הפרויקט שמכיל את הקוד לדוגמה.
cd python-pubsub/samples/snippets/quickstart/
מפעילים את האפליקציות ומתבוננים בזרימת ההודעות
הפעלת הבקשה של מנוי 1
במסוף sub_one, מפעילים את Subscriber 1:
Bash
python sub.py $PROJECT sub_one
PowerShell
py sub.py $env:PROJECT sub_one
אחרי ההפעלה, האפליקציה הזו פותחת חיבור סטרימינג דו-כיווני עם השרת. ההודעות מועברות בזרם ב-Pub/Sub.

הגשת בקשה להצטרפות לתוכנית
במסוף המוציא לאור, מפעילים את אפליקציית המוציא לאור:
Bash
python pub.py $PROJECT hello_topic
PowerShell
py pub.py $env:PROJECT hello_topic
אחרי שהאפליקציה של בעל התוכן הדיגיטלי מתחילה לפעול, מערכת Pub/Sub מבצעת את הפעולות הבאות:
אפליקציית בעל התוכן הדיגיטלי שולחת הודעה 'Hello, World!' אל Pub/Sub בלי לדעת על מינויים קיימים. השרת גם מקצה מזהה להודעה.
האפליקציה Subscriber 1 מקבלת את ההודעה Hello, World!, מדפיסה אותה ושולחת אישור ל-Pub/Sub.
האישור מודפס באפליקציית בעל התוכן הדיגיטלי. האישור מודיע ל-Pub/Sub שההודעה עברה עיבוד בהצלחה ואין צורך לשלוח אותה מחדש למנוי sub_one הזה או למנוי אחר.
שירות Pub/Sub מסיר את ההודעה מ-sub_one.

הפעלת הבקשה של מנוי 2
בטרמינל sub_two, מפעילים את Subscriber 2:
Bash
python sub.py $PROJECT sub_two
PowerShell
py sub.py $env:PROJECT sub_two
המשתמש הזה רשום למינוי sub_two ומקבל את ההודעות שנשלחות אליו.
מנוי 2 משתמש שוב בסקריפט sub.py. ההבדל הוא שSubscriber
2 לא מתחיל עד שה-Publisher שולח את ההודעה לנושא ולמינויים. אם המוציא לאור היה מתקשר ישירות אל הנמען 2, אפליקציית הפרסום הייתה צריכה להמתין עד שהנמען 2 יתחבר או שהיה מתרחש פסק זמן. מערכת Pub/Sub מנהלת את התהליך הזה על ידי שמירת ההודעה עבור מנוי 2.

עכשיו אפשר להתחיל לפתח באמצעות Pub/Sub.
איך היה?
בדף התמיכה של Pub/Sub אפשר למצוא משאבים וקישורים נוספים.
הסרת המשאבים
- מפסיקים את כל האפליקציות שפועלות.
- מוחקים את ספריית קוד הדוגמה מהסביבה המקומית.
למחוק את הנושא.
gcloud pubsub topics delete hello_topic
מוחקים את המינויים.
gcloud pubsub subscriptions delete sub_one
gcloud pubsub subscriptions delete sub_two
משביתים את פרויקט ההדרכה בקטע IAM & admin במסוף Cloud de Confiance .
-
אם תרצו, תוכלו לבטל את פרטי הכניסה שיצרתם ולמחוק את הקובץ המקומי של פרטי הכניסה.
gcloud auth application-default revoke
-
אם רוצים, מבטלים את פרטי הכניסה של ה-CLI של gcloud.
gcloud auth revoke
המאמרים הבאים
הנה כמה דברים שאפשר לנסות:
מעיינים בקוד של
pub.pyושלsub.pyבמדריך, ומעיינים בדוגמאות אחרות של Pub/Sub ב-GitHub. כתרגיל, יוצרים גרסה שלpub.pyשמפרסמת את השעה המקומית כל שנייה.באמצעות מינויים לדחיפה, אפשר לקבל הודעות שמפעילות נקודות קצה של App Engine או Cloud Functions.
אפשר לאחזר הודעות שאושרו בעבר באמצעות הפעלה מחדש. כברירת מחדל, מערכת Pub/Sub מסירה מהמינויים הודעות שאושרה קבלתן. לדוגמה, במדריך הזה לא תוכלו להריץ מחדש את הפקודה
sub.pyכדי לקבל שוב את ההודעה Hello, World!. תכונת ההפעלה מחדש מאפשרת לכם להגדיר מינויים כדי לקבל הודעות אחרי שהן אושרו.תחילת העבודה עם ספריות לקוח בשפות אחרות.