יצירת מערכת Pub/Sub מסוג אחד לרבים

במדריך הזה מוסבר איך להגדיר קבוצה של אפליקציות שמתקשרות ביניהן באמצעות שליחת הודעות דרך Pub/Sub, במקום באמצעות בקשות RPC סינכרוניות. הפרדה בין אפליקציות מאפשרת:

  • שיפור היציבות של האפליקציות
  • יכול לפשט את הפיתוח

לדוגמה, הצד המתקשר (בעל האתר) לא צריך שהצד המקבל (המשתמש) יהיה מחובר וזמין. בעל התוכן הדיגיטלי שולח הודעה ל-Pub/Sub. בעל התוכן הדיגיטלי לא צריך לדעת אילו אפליקציות של מנויים צריכות לקבל את ההודעה וכמה כאלה יש. כתוצאה מכך, אפשר להסתמך על השירות שיעביר את ההודעה לאחת או יותר מהאפליקציות של המנויים בכל פעם שהן זמינות.

סקירה כללית של המערכת

במדריך הזה תתחילו למלא בקשה להצטרפות לתוכנית השותפים של Google, ותשלחו את ההודעה Hello, World! לשני מנויים באמצעות תקשורת אחד לרבים, כמו שמוצג בתרשים הבא:

דיאגרמה של הנושא, המינויים שמצורפים אליו והאפליקציות לשליחת הודעות והאפליקציות הרשומות ששולחות הודעות ל-Cloud Pub/Sub ומקבלות ממנו הודעות

שתי האפליקציות של המנויים משתמשות באותו קוד, אבל מתחילות בזמנים שונים. התהליך הזה מדגים איך Pub/Sub מאפשר תקשורת אסינכרונית. כדי לבנות את המערכת הזו, צריך לבצע את השלבים הבאים:

  1. יוצרים חשבון שירות ב-IAM שהאפליקציות משתמשות בו לאימות.
  2. מגדירים הרשאות IAM.
  3. יוצרים נושא Pub/Sub ומינוי.
  4. מפעילים שלוש אפליקציות עצמאיות: אפליקציה אחת של בעל תוכן דיגיטלי ושתי אפליקציות של מנויים.

לפני שמתחילים

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. התקינו את ה-CLI של Google Cloud.

  3. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  4. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  5. יוצרים או בוחרים Google Cloud פרויקט.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (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 .

  6. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  7. מפעילים את Pub/Sub API:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    gcloud services enable pubsub.googleapis.com
  8. יוצרים פרטי כניסה לאימות מקומי עבור חשבון המשתמש:

    gcloud auth application-default login

    אם מוחזרת שגיאת אימות ואתם משתמשים בספק זהויות חיצוני (IdP), ודאו ש נכנסתם ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  9. מעניקים תפקידים לחשבון המשתמש. מריצים את הפקודה הבאה לכל אחד מהתפקידים הבאים ב-IAM: roles/pubsub.publisher, roles/pubsub.subscriber

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    מחליפים את מה שכתוב בשדות הבאים:

    • PROJECT_ID: מזהה הפרויקט.
    • USER_IDENTIFIER: המזהה של חשבון המשתמש . לדוגמה, myemail@example.com.
    • ROLE: תפקיד ה-IAM שאתם מקצים לחשבון המשתמש.
  10. התקינו את ה-CLI של Google Cloud.

  11. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  12. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  13. יוצרים או בוחרים Google Cloud פרויקט.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (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 .

  14. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  15. מפעילים את Pub/Sub API:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    gcloud services enable pubsub.googleapis.com
  16. יוצרים פרטי כניסה לאימות מקומי עבור חשבון המשתמש:

    gcloud auth application-default login

    אם מוחזרת שגיאת אימות ואתם משתמשים בספק זהויות חיצוני (IdP), ודאו ש נכנסתם ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  17. מעניקים תפקידים לחשבון המשתמש. מריצים את הפקודה הבאה לכל אחד מהתפקידים הבאים ב-IAM: roles/pubsub.publisher, roles/pubsub.subscriber

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    מחליפים את מה שכתוב בשדות הבאים:

    • PROJECT_ID: מזהה הפרויקט.
    • USER_IDENTIFIER: המזהה של חשבון המשתמש . לדוגמה, myemail@example.com.
    • 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

יצירת מערכת 'אחד לרבים'

הורדת הקוד של בעל האתר והקוד של המנוי

  1. מורידים את קובצי ה-Python של Pub/Sub שנדרשים למדריך הזה.

     git clone https://github.com/googleapis/python-pubsub.git
  2. לפני שממשיכים, צריך לסגור את כל המסופים הפתוחים.

הגדרת שלושה מסופים

  1. מפעילים טרמינל אחד לכל אפליקציה במדריך (אפליקציה אחת של בעל תוכן דיגיטלי ושתי אפליקציות של מנויים). לנוחותכם, במדריך הזה נשתמש במונחים הבאים לתיאור המסופים האלה:

    • טרמינל publisher
    • מסוף sub_one
    • מסוף sub_two
  2. בטרמינל של המוציא לאור, יוצרים סביבה וירטואלית של 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) $.

  3. במסוף של השולח, מתקינים את ספריית הלקוח של Python ל-Pub/Sub באמצעות pip:

    python -m pip install --upgrade google-cloud-pubsub
  4. בכל שלושת הטרמינלים, מגדירים משתנה סביבה עם מזהה הפרויקט הנוכחי. הפקודה הזו ב-gcloud קובעת את מזהה הפרויקט שבחרתם ומגדירה אותו כמשתנה:

    Bash

    export PROJECT=`gcloud config get-value project`

    PowerShell

    $env:PROJECT=$(gcloud config get-value project)
  5. בכל שלושת חלונות הטרמינל, עוברים לנתיב הפרויקט שמכיל את הקוד לדוגמה.

    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.

מנוי 1
  האפליקציה מתחילה להאזין להודעות במינוי sub_one.

הגשת בקשה להצטרפות לתוכנית

במסוף המוציא לאור, מפעילים את אפליקציית המוציא לאור:

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.

  • אפליקציית Publisher מדפיסה את האישור. האישור הזה מודיע ל-Pub/Sub שההודעה עברה עיבוד בהצלחה ואין צורך לשלוח אותה מחדש למנוי sub_one הזה או למנוי אחר.

המערכת של Pub/Sub מסירה את ההודעה מ-sub_one.

האפליקציה Publisher
  מפרסמת את ההודעה ומקצה לה מזהה. אפליקציית המנוי 1 מקבלת את ההודעה 'Hello World' ושולחת אישור

הפעלת האפליקציה Subscriber 2

בטרמינל sub_two, מפעילים את Subscriber 2 (מינוי 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.

מנוי 2
  מתחיל להאזין ומקבל את ההודעה שהמתינה לו ב-sub_two

עכשיו אפשר להתחיל לפתח באמצעות Pub/Sub.

איך היה?

בדף התמיכה של Pub/Sub אפשר למצוא משאבים וקישורים נוספים.

הסרת המשאבים

  1. מפסיקים את כל האפליקציות הפעילות.
  2. מוחקים את ספריית קוד הדוגמה מהסביבה המקומית.
  3. למחוק את הנושא.

    gcloud pubsub topics delete hello_topic
  4. מוחקים את המינויים.

    gcloud pubsub subscriptions delete sub_one
    gcloud pubsub subscriptions delete sub_two
  5. משביתים את פרויקט ההדרכה בקטע IAM & admin במסוף Google Cloud .

  6. אם תרצו, תוכלו לבטל את פרטי הכניסה שיצרתם ולמחוק את הקובץ המקומי של פרטי הכניסה.

    gcloud auth application-default revoke
  7. אם רוצים, מבטלים את פרטי הכניסה של ה-CLI של gcloud.

    gcloud auth revoke

המאמרים הבאים

הנה כמה דברים שאפשר לנסות:

  • מעיינים בקוד של pub.py ושל sub.py במדריך, ומעיינים בדוגמאות אחרות של Pub/Sub ב-GitHub. כתרגיל, צריך ליצור גרסה של pub.py שמפרסמת את השעה המקומית בכל שנייה.

  • איך שולחים הודעות בקבוצות

  • באמצעות מינויים לדחיפה, אפשר לקבל הודעות שמפעילות נקודות קצה של App Engine או Cloud Functions.

  • אפשר לשמוע ולראות מחדש הודעות שאושרו בעבר באמצעות הפעלה מחדש. כברירת מחדל, מערכת Pub/Sub מסירה הודעות שאושר שהן התקבלו מהמינויים. לדוגמה, במדריך הזה לא תוכלו להריץ מחדש את sub.py כדי לקבל שוב את ההודעה Hello, World!. תכונת ההפעלה מחדש מאפשרת להגדיר מינויים כדי לקבל הודעות אחרי שהן אושרו.

  • תחילת העבודה עם ספריות לקוח בשפות אחרות