Cara mempercepat pengembangan agen RBM dengan langganan pull

Agen RBM menerima pesan dan peristiwa melalui hubungan publikasi/langganan dengan Google Cloud Pub/Sub. Saat pengguna merespons pesan agen Anda, platform RBM memublikasikan pesan tersebut ke topik Pub/Sub unik yang hanya dapat diakses oleh agen Anda. Agen Anda mengakses pesan dan peristiwa tersebut melalui langganan ke topik uniknya.

Pub/Sub mendukung dua jenis langganan: push dan pull. Dengan langganan push, Cloud Pub/Sub mengirim pesan ke URL webhook yang Anda konfigurasikan. Dengan berlangganan pull, Anda bertanggung jawab menulis kode untuk membuat pemroses pesan yang berjalan lama dan untuk mengakui pesan saat Anda menerimanya.

Pendekatan yang lebih populer dan populer untuk sebagian besar developer adalah langganan push. Jika Anda telah menggunakan API pihak ketiga, berarti Anda telah bekerja dengan URL callback/webhook. Meskipun pendekatan ini sederhana, metode ini memerlukan URL yang tersedia secara publik, yang memaksa developer untuk men-deploy ke server web publik setiap kali mereka ingin menguji perubahan.

Dalam artikel ini, saya akan menunjukkan cara menyiapkan langganan pull untuk pengujian lokal dan cara menggunakan langganan ini di lingkungan produksi dengan App Engine Google Cloud.

Mengonfigurasi Pub/Sub untuk langganan pull

Jika Anda belum mengonfigurasi Pub/Sub untuk agen, ikuti petunjuk dalam Cloud Pub/Sub untuk membuat langganan awal.

Setelah membuat langganan, Anda dapat beralih dengan mudah dari model push ke pull. Buka Google Cloud Console, lalu buka bagian Pub/Sub > Subscriptions. Klik menu tambahan di samping langganan yang Anda buat untuk agen Anda, lalu pilih Edit. Anda akan melihat layar konfigurasi yang mirip dengan gambar di bawah.

Detail langganan

Setel Delivery Type ke Pull,lalu klik Save.

Menyiapkan pengendali langganan pull asinkron

Selanjutnya, Anda perlu memperbarui agen RBM untuk mengambil pesan dari langganan. Anda dapat membaca cara melakukannya dengan berbagai bahasa pemrograman di Pull asinkron atau melihat beberapa sampel agen RBM, yang banyak di antaranya menggunakan model pull.

Kode di bawah ini menunjukkan cara menyiapkan pemroses langganan pull asinkron di 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 };
}

Untuk menguji agen secara lokal, yang perlu Anda lakukan adalah memanggil initPubsub saat aplikasi ekspres dimulai, dan Anda akan melihat respons pencetakan messageHandler dalam konsol.

Mengonfigurasi dan men-deploy ke App Engine Google

Dalam lingkungan produksi, Anda harus memastikan langganan selalu tersedia. Salah satu pendekatan sederhana adalah mengandalkan cron job untuk melakukan inisialisasi ulang pemroses pesan Pub/Sub secara berkala.

Di App Engine, cron job dapat digunakan untuk menjadwalkan tugas dengan interval yang berbeda-beda. cron job dikonfigurasi dengan deskripsi, URL, dan interval. Di aplikasi Node.js, Anda mengonfigurasi ini di file cron.yaml, yang dapat Anda deploy ke App Engine menggunakan Google Cloud SDK. Anda dapat membaca penyiapan konfigurasi bahasa lainnya di Menjadwalkan tugas dengan cron.yaml.

Karena tugas cron memerlukan URL, Anda perlu menambahkan endpoint URL ke router aplikasi ekspres untuk dipanggil oleh cron, yang akan memanggil metode initPubsub dari bagian sebelumnya untuk memulai pemroses.

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();
});

Dalam callback, Anda juga perlu menghapus pemroses sebelum tugas terjadwal dieksekusi lagi. Misalnya, jika cron job berjalan setiap menit, Anda harus mengonfigurasi parameter CRON_JOB_TIMEOUT agar sama dengan 60.

Berikut adalah konfigurasi file cron.yaml untuk menjalankan endpoint ini setiap menit.

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

Untuk men-deploy tugas cron ke App Engine, jalankan perintah berikut:

gcloud app deploy cron.yaml

Setelah deployment, App Engine akan otomatis mengonfigurasi tugas cron, dan tugas tersebut dapat dilihat pada App Engine > Cron job seperti yang terlihat di bawah.

cron job berhasil dikonfigurasi

Penutup & TL;DR

Dengan menggunakan langganan pull, Anda dapat menguji dan melakukan debug secara lokal. Hal ini membantu mempercepat siklus pengembangan dan mengurangi waktu yang diperlukan untuk membuat agen RBM. Meskipun model pull memerlukan beberapa konfigurasi dan kode tambahan dibandingkan dengan model push, penyiapannya sederhana dan hanya perlu dikonfigurasi sekali. Cron job adalah cara mudah untuk memastikan langganan pull Anda selalu tersedia untuk menangani alur pesan agen, dan App Engine membuat penyiapan dan pemeliharaannya sangat murah.

Semoga berhasil dan selamat melakukan coding!