איך אפשר להאיץ את פיתוח סוכן ה-RBM באמצעות מינוי משיכה

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

Pub/Sub תומך בשני סוגי מינויים: push ו-pull. מינוי ב-Cloud Pub/Sub שולח הודעות לכתובת ה-webhook שהגדרתם. מינוי אחזור הוא באחריותכם לכתוב קוד כדי להקשיב להודעות במשך זמן רב ולאשר את ההודעות שאתם מקבלים.

הגישה המוכרת והפופולרית ביותר לרוב המפתחים היא מינוי הדחיפה. אם השתמשתם בממשקי API של צד שלישי, סביר להניח שעבדתם עם כתובות URL לקריאה חוזרת (callback) או על תגובה לפעולה מאתר אחר (webhook). אמנם זו גישה פשוטה, אבל היא מחייבת כתובת URL גלויה לכולם, שמאלצת את המפתחים לפרוס לשרתי אינטרנט ציבוריים בכל פעם שהם רוצים לבדוק שינוי.

במאמר הזה אראה לכם איך להגדיר מינוי לשליפה לבדיקה מקומית ואיך להשתמש במינוי הזה בסביבת ייצור באמצעות App Engine של Google Cloud.

הגדרת Pub/Sub למינוי משיכה

אם עדיין לא הגדרתם את Pub/Sub לנציג, בצעו את ההוראות המפורטות ב-Cloud Pub/Sub כדי ליצור את המינוי הראשוני.

לאחר יצירת המינוי, קל לעבור ממודל דחיפה למודל משיכה. עוברים אל Google Cloud Console ואחר כך לקטע Pub/Sub > מינויים. לוחצים על סמל האפשרויות הנוספות ליד המינוי שיצרתם לנציג ובוחרים באפשרות עריכה. מסך תצורה אמור להיראות כמו התמונה שלמטה.

פרטי מנוי

מגדירים את סוג המשלוח למשיכה ולוחצים על שמירה.

הגדרת handler לאסינכרוני של מינוי handler

בשלב הבא צריך לעדכן את נציג RBM כדי לשלוף הודעות מהמינוי. אתם יכולים לקרוא איך לעשות זאת באמצעות שפות תכנות שונות במשיכה אסינכרונית, או לבחון כמה מהדוגמאות של סוכן RBM, שרבות מהן משתמשות במודל משיכה.

הקוד הבא ממחיש איך להגדיר האזנה אסינכרונית למנוי ב-Node.js:

function initPubsub() {
    let pubsub = new PubSub({
        projectId: REPLACE_WITH_GCP_PROJECT_ID,
        keyFilename: REPLACE_WITH_SERVICE_ACCOUNT_KEY_FILE_LOCATION,
    });

    // references an existing subscription, (e.g. rbm-agent-sub)
    let subscription = pubsub.subscription(PUB_SUB_SUBSCRIPTION_NAME);

    // create an event handler to handle messages
    let messageHandler = (message) => {
        console.log(`Received message ${message.id}:`);
        console.log(`\tData: ${message.data}`);
        console.log(`\tAttributes: ${message.attributes}`);

        let userEvent = JSON.parse(message.data);

        // TODO: process the userEvent to create another RBM message
        // "Ack" (acknowledge receipt of) the message
        message.ack();
    };

    // Listen for new messages
    subscription.on('message', messageHandler);

    return { messageHandler: messageHandler, subscription: subscription };
}

כדי לבדוק נציגים באופן מקומי, כל מה שצריך לעשות הוא להתקשר אל initPubsub כשהאפליקציה Express תתחיל, ותוצג לך messageHandler תגובות להדפסה במסוף.

הגדרה ופריסה ב-Google App Engine

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

ב-App Engine, אפשר להשתמש במשימות cron כדי לתזמן משימות במרווחי זמן שונים. משימת cron מוגדרת עם תיאור, כתובת URL ומרווח. באפליקציות Node.js, ניתן להגדיר אותן בקובץ cron.yaml, שאותו ניתן לפרוס ב-App Engine באמצעות Google Cloud SDK. אפשר לקרוא מידע נוסף על הגדרות אחרות של הגדרות השפה בתזמון משימות באמצעות cron.yaml.

מאחר שמשימת ה-cron זקוקה לכתובת URL, יש להוסיף נקודת קצה לכתובת URL אל נתב האפליקציה האקספרס כדי להפעיל אותו על ידי cron. פעולה זו תפעיל את השיטה initPubsub מהקטע הקודם כדי להתחיל את ה-listener.

router.get('/pubsubCallback', function(req, res, next) {
  let pubsubConfig = initPubsub();

      // Stop listening once the timeout is hit
      setTimeout(() => {
        pubsubConfig.subscription.removeListener('message', pubsubConfig.messageHandler);
      }, CRON_JOB_TIMEOUT * 1000);

  res.status(200).send();
});

במסגרת הקריאה החוזרת, תצטרכו גם להסיר את ה-listener לפני שהמשימה המתוזמנת תתבצע שוב. לדוגמה, אם משימת cron פועלת בכל דקה, מגדירים את הפרמטר CRON_JOB_TIMEOUT כך שיהיה שווה ל-60.

למטה מופיעה התצורה של קובץ cron.yaml להפעלת נקודת הקצה הזו בכל דקה.

cron:
- description: "Processing Pub/Sub messages"
  url: /pubsubCallback
  schedule: every 1 mins

כדי לפרוס את משימות ה-cron ב-App Engine, מריצים את הפקודה הבאה:

gcloud app deploy cron.yaml

לאחר הפריסה, מנוע האפליקציה מגדיר את משימת cron באופן אוטומטי, והמשימה ניתנת לצפייה בקטע App Engine > משימות cron כפי שמוצג בהמשך.

משימת cron מוגדרת

סיכום ו-TL;DR

מינוי מינוי מאפשר לך לבצע ניפוי באגים וניפוי באגים באופן מקומי, במטרה לזרז את מחזורי הפיתוח ולהפחית את הזמן שלוקח ליצור סוכני RBM. על אף שבמודל המשיכה נדרשת הגדרה נוספת וקוד נוסף בהשוואה למודל הדחיפה, ההגדרה פשוטה ויש לקבוע אותו פעם אחת בלבד. משימות Cron הן דרך קלה לוודא שהמינוי שלכם למשיכה זמין תמיד לטיפול בזרימת ההודעות של הנציג. ב-App Engine, תהליך ההגדרה והתחזוקה הוא נמוך מאוד.

שיהיה בהצלחה!