במדריך הזה מוסבר איך להגדיר קבוצה של אפליקציות שמתקשרות ביניהן באמצעות שליחת הודעות דרך Pub/Sub, במקום באמצעות RPC סינכרוני. הפרדה בין אפליקציות מאפשרת:
- האפליקציות הופכות ליציבות יותר
- יכול לפשט את הפיתוח
לדוגמה, הצד שמתקשר (בעל האתר) לא צריך שהצד שמקבל את השיחה (המשתמש) יהיה זמין. בעל התוכן הדיגיטלי שולח הודעה ל-Pub/Sub. בעל התוכן הדיגיטלי לא צריך לדעת אילו אפליקציות של מנויים צריכות לקבל את ההודעה וכמה כאלה יש. כתוצאה מכך, אפשר להסתמך על השירות שיעביר את ההודעה לאפליקציות של מנויים כשהן זמינות.
סקירה כללית של המערכת
במדריך הזה תפעילו אפליקציית בעל תוכן דיגיטלי ששולחת את ההודעה "Hello, World!" לשני מנויים באמצעות תקשורת אחד לרבים, כמו שמוצג בתרשים הבא:
שתי אפליקציות המנויים משתמשות באותו קוד, אבל אתם מפעילים אותן בזמנים שונים. התהליך הזה מדגים איך Pub/Sub מאפשר תקשורת אסינכרונית. כדי לבנות את המערכת הזו, צריך לבצע את השלבים הבאים:
- יוצרים חשבון שירות ב-IAM שהאפליקציות משתמשות בו לאימות.
- מגדירים הרשאות IAM.
- יוצרים נושא ומינוי ב-Pub/Sub.
- מפעילים שלוש אפליקציות עצמאיות: אפליקציה אחת של בעל תוכן דיגיטלי ושתי אפליקציות של מנויים.
לפני שמתחילים
-
התקינו את ה-CLI של Google Cloud.
-
הגדירו שה-CLI של gcloud ישתמש בזהות המאוחדת שלכם.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים פרויקט ב- Google Cloud .
תפקידים שנדרשים כדי לבחור או ליצור פרויקט
- בחירת פרויקט: כדי לבחור פרויקט לא נדרש תפקיד IAM ספציפי – אתם יכולים לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד "יצירת פרויקטים" (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
-
יוצרים Google Cloud פרויקט:
gcloud projects create PROJECT_ID
מחליפים את
PROJECT_IDבשם של פרויקט Google Cloud שיוצרים. -
בוחרים את הפרויקט שיצרתם ב- Google Cloud :
gcloud config set project PROJECT_ID
מחליפים את
PROJECT_IDבשם הפרויקט ב- Google Cloud .
מפעילים את 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
אם מוחזרת שגיאת אימות, צריך לוודא ש נכנסתם ל-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) $.בטרמינל של המוציא לאור, מתקינים את ספריית הלקוח של Pub/Sub ב-Python באמצעות
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 מעביר הודעות בסטרימינג.

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

מפעילים את האפליקציה Subscriber 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 במסוף Google Cloud .
-
אם תרצו, תוכלו לבטל את פרטי הכניסה שיצרתם ולמחוק את הקובץ המקומי של פרטי הכניסה.
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!. תכונת ההפעלה מחדש מאפשרת להגדיר מינויים כדי לקבל הודעות אחרי שהן אושרו.תחילת העבודה עם ספריות לקוח בשפות אחרות.