วิธีเพิ่มความเร็วในการพัฒนา Agent RBM ด้วยการสมัครใช้บริการพุล

ตัวแทน RBM รับข้อความและเหตุการณ์ผ่านความสัมพันธ์ในการเผยแพร่/การสมัครรับข้อมูลกับ Google Cloud Pub/Sub เมื่อผู้ใช้ตอบกลับข้อความของตัวแทน แพลตฟอร์ม RBM จะเผยแพร่ข้อความเหล่านั้นไปยังหัวข้อ Pub/Sub ที่ไม่ซ้ํากันซึ่งมีเพียงตัวแทนเท่านั้นที่เข้าถึงได้ ตัวแทนจะเข้าถึงข้อความและเหตุการณ์เหล่านี้ผ่านการสมัครรับข้อมูลในหัวข้อที่ไม่ซ้ํากัน

Pub/Sub รองรับการสมัครใช้บริการ 2 ประเภท ได้แก่ push และ pull ด้วยการสมัครใช้บริการพุช Cloud Pub/Sub จะส่งข้อความไปที่ URL ของเว็บฮุคที่คุณกําหนดค่าไว้ ด้วยการสมัครสมาชิกแบบพุล คุณมีหน้าที่เขียนรหัสเพื่อสร้าง Listener ข้อความที่ใช้งานได้นานและรับทราบข้อความเมื่อคุณได้รับ

วิธีการยอดนิยมและเป็นที่นิยมยิ่งขึ้นสําหรับนักพัฒนาซอฟต์แวร์ส่วนใหญ่คือการสมัครใช้บริการ Push หากคุณเคยใช้ API ของบุคคลที่สาม คุณน่าจะใช้ URL เรียกกลับ/เว็บฮุคได้ แต่วิธีนี้มักต้องใช้ URL ที่เปิดเผยต่อสาธารณะซึ่งบังคับให้นักพัฒนาซอฟต์แวร์ติดตั้งใช้งานเว็บเซิร์ฟเวอร์สาธารณะทุกครั้งที่ต้องการทดสอบการเปลี่ยนแปลง

ในบทความนี้ เราจะแสดงวิธีตั้งค่าการสมัครใช้บริการแบบพุลสําหรับการทดสอบในพื้นที่ และวิธีสมัครใช้บริการนี้ในสภาพแวดล้อมการใช้งานจริงกับ App Engine ของ Google Cloud

การกําหนดค่า Pub/Sub สําหรับการสมัครใช้บริการพุล

หากยังไม่ได้กําหนดค่า Pub/Sub สําหรับตัวแทน ให้ทําตามวิธีการใน Cloud Pub/Sub เพื่อสร้างการสมัครใช้บริการเริ่มต้น

เมื่อคุณสร้างการสมัครของคุณแล้ว คุณสามารถสลับจากแบบพุชเป็นโมเดลได้ ไปที่ Google Cloud Console จากนั้นไปที่ส่วน Pub/Sub > การสมัครใช้บริการ คลิกเมนูรายการเพิ่มเติมข้างการสมัครใช้บริการที่คุณสร้างไว้สําหรับตัวแทน แล้วเลือกแก้ไข คุณควรจะเห็นหน้าจอการกําหนดค่าที่คล้ายกับภาพด้านล่าง

รายละเอียดการสมัครใช้บริการ

ตั้งค่าประเภทการแสดงโฆษณาเป็นดึง แล้วคลิกบันทึก

การตั้งค่าเครื่องจัดการการสมัครใช้บริการแบบอะซิงโครนัส

ต่อไปคุณต้องอัปเดตตัวแทน RBM ให้ดึงข้อความจากการสมัครใช้บริการ คุณสามารถอ่านวิธีการโดยใช้ภาษาการเขียนโปรแกรมต่างๆ ในการดึงแบบอะซิงโครนัส หรือดูตัวอย่างของ RBM ที่มีอยู่ ซึ่งส่วนใหญ่จะใช้โมเดลการดึง

โค้ดด้านล่างแสดงวิธีตั้งค่า Listener การสมัครรับการดึงข้อมูลแบบอะซิงโครนัสใน 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 ภายในคอนโซล

การกําหนดค่าและการทําให้ใช้งานได้กับ App Engine ของ Google

ในสภาพแวดล้อมการใช้งานจริง คุณต้องตรวจสอบว่าการติดตามพร้อมใช้งานเสมอ วิธีง่ายๆ อย่างหนึ่งคือการใช้งาน Cron เพื่อเริ่ม Listener ข้อความ Pub/Sub เป็นระยะ

ใน App Engine คุณสามารถใช้งาน Cron เพื่อกําหนดเวลางานที่มีช่วงเวลาแตกต่างกันได้ งาน Cron มีการกําหนดค่าด้วยคําอธิบาย, URL และช่วงเวลา ในแอป Node.js คุณจะต้องกําหนดค่าเหล่านี้ในไฟล์ cron.yaml ซึ่งคุณนําไปปรับใช้กับ App Engine ได้โดยใช้ Google Cloud SDK คุณสามารถอ่านเกี่ยวกับการตั้งค่าภาษาอื่นๆ ได้ในการตั้งเวลางานด้วย cron.yaml

เนื่องจากงาน Cron ต้องใช้ URL คุณจึงต้องเพิ่มปลายทางของ URL ในเราเตอร์ของแอป Express เพื่อให้เรียกใช้ 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();
});

ภายในโค้ดเรียกกลับ คุณจะต้องนําผู้ฟังออกก่อนที่งานที่กําหนดเวลาไว้จะทํางานอีกครั้ง ตัวอย่างเช่น ถ้างาน 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

หลังจากทําให้ใช้งานได้แล้ว App Engine จะกําหนดค่างาน Cron โดยอัตโนมัติ และสามารถดูงานได้ในส่วน App Engine > งาน Cron ดังที่แสดงด้านล่าง

งาน Cron ที่กําหนดค่าไว้

สรุปและ TL;DR

การสมัครใช้บริการพุลช่วยให้คุณทดสอบและแก้ไขข้อบกพร่องภายในเครื่องได้ ซึ่งช่วยให้วงจรการพัฒนาเร็วขึ้นและลดเวลาที่ใช้ในการสร้าง Agent RBM แม้ว่าโมเดลการดึงต้องใช้การกําหนดค่าและโค้ดเพิ่มเติมบางอย่างกับโมเดลการพุช แต่การตั้งค่าไม่ซับซ้อนและต้องกําหนดค่าเพียงครั้งเดียว งาน cron เป็นวิธีง่ายๆ ที่จะทําให้แน่ใจว่าการสมัครรับข้อมูลแบบพุลของคุณพร้อมใช้งานเสมอสําหรับการรับส่งอีเมลของตัวแทน และ App Engine ช่วยให้การตั้งค่าและการบํารุงรักษามีค่าใช้จ่ายต่ํามาก

ขอให้สนุกและเขียนโค้ดให้สนุกนะ