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

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

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

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

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

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

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

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

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

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

  1. התקינו את ה-CLI של Google Cloud.

  2. הגדירו שה-CLI של gcloud ישתמש בזהות המאוחדת שלכם.

    איך נכנסים ל-CLI של gcloud באמצעות הזהות המאוחדת?

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

    gcloud init
  4. יוצרים או בוחרים פרויקט ב- 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 .

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

  6. מפעילים את Pub/Sub API, אם הוא עדיין לא מופעל:

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

    כדי להפעיל ממשקי API, צריך את ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

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

    gcloud auth application-default login

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

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

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

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

התקנת 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. מפעילים טרמינל אחד לכל אפליקציה במדריך (מפרסם אחד ושני מנויים). לנוחותכם, במדריך הזה נשתמש במונחים הבאים לתיאור המסופים האלה:

    • מסוף בעל התוכן הדיגיטלי
    • מסוף 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. בטרמינל של המוציא לאור, מתקינים את ספריית הלקוח של Pub/Sub ב-Python באמצעות 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.

מפעילים את אפליקציית 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.

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

מפעילים את האפליקציה 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.

מנוי 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!. תכונת ההפעלה מחדש מאפשרת להגדיר מינויים כדי לקבל הודעות אחרי שהן אושרו.

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