Cara menangani pengguna offline di kampanye RBM

Faktor utama dalam waktu pengiriman pesan agen Anda adalah apakah pengguna yang Anda coba hubungi memiliki koneksi data pada saat agen Anda mengirim pesan. Jika pengguna offline, platform RBM akan menyimpan pesan dan mencoba mengirimkannya hingga 30 hari. Jika pesan tidak dapat dikirimkan pada saat itu, pesan akan dihapus dari sistem.

Ada banyak alasan dan situasi saat pengguna mungkin tidak memiliki konektivitas saat agen Anda mencoba menghubungi mereka. Mereka mungkin telah menonaktifkan data untuk menghemat biaya paket seluler, mungkin sedang berada di pesawat tanpa koneksi Wi-Fi, atau mungkin sedang berada di kereta bawah tanah di dalam terowongan. Tergantung pada urgensinya yang digunakan untuk menerima pesan, agen Anda harus menangani pengguna offline dengan mencabut pesan RBM yang tidak terkirim dan merutekan ulang pesan tersebut melalui saluran yang berbeda.

Bagian berikut memberikan detail tentang cara menggunakan Google Cloud Datastore untuk melacak pesan yang Anda kirim dan sampaikan, cara menggunakan cron untuk cabut pesan yang tidak terkirim, dan cara merutekan ulang pesan tersebut melalui SMS.

Melacak pesan yang dikirim

Setiap pesan yang dikirim oleh agen RBM Anda harus menyertakan ID pesan yang unik. Untuk melacak pesan yang dikirim agen, Anda harus menyimpan ID pesan, nomor telepon, dan stempel waktu untuk setiap pesan.

Anda dapat menggunakan berbagai teknologi untuk menyimpan informasi ini, termasuk Google Cloud Datastore. Cloud Datastore adalah database NoSQL yang sangat skalabel dan secara otomatis menangani sharding dan replikasi. Ini adalah solusi yang tepat untuk menyimpan data non-relasional seperti pesan yang dikirim oleh agen. Cloud Datastore bergantung pada adanya instance Google App Engine yang aktif, sehingga Anda dapat menggunakan App Engine untuk menghosting agen RBM dan mengonfigurasi tugas cron.

Ada library klien untuk Cloud Datastore yang tersedia dalam banyak bahasa. Sebagai contoh ini, Anda dapat menggunakan Node.js dan mendasarkan kode agen RBM pada Contoh Node.js Agen Pertama tersedia di Situs Developer RBM. Pertama, instal Cloud Datastore untuk project Node.js saya dengan menjalankan perintah berikut:

npm install --save @google-cloud/datastore

Dalam kode sumber agen, tambahkan referensi global ke library klien Cloud Datastore.

// Imports the Google Cloud client library
const Datastore = require('@google-cloud/datastore');

// Creates a client
const datastore = new Datastore({
    projectId: PROJECT_ID,
});

Setelah objek datastore dibuat, Anda dapat memperkenalkan fungsi untuk menyimpan Status msisdn, message id, sent time, dan delivery untuk setiap pesan.

/**
 *   Records an entry in the Cloud Datastore to keep track of the
 *   messageIds sent to users and the delivery state.
 *
 *   @property {string} msisdn The user's phone number in E.164 format.
 *   @property {string} messageId The unique message identifier.
 *   @property {boolean} delivered True if message has been delivered.
 */
function saveMessage(msisdn, messageId, delivered) {
    const messageKey = datastore.key(['Message', messageId]);

    const dataForMessage = {
        key: messageKey,
        data: {
            id: messageId,
            msisdn: msisdn,
            lastUpdated: new Date().getTime(),
            delivered: delivered
        },
    };

    // Record that the message was sent.
    datastore
        .save(dataForMessage)
        .then(function() {
            console.log('saved message successfully');
        })
        .catch((err) => {
            console.error('ERROR:', err);
        });
}

Dengan menerapkan fungsi ini, Anda perlu memanggil metode ini setiap kali agen Anda mengirim pesan ke pengguna. Kapan klien RBM Node.js koleksi mengirimkan pesan RBM, library menyediakan objek respons dalam callback yang berisi messageId untuk pesan yang telah dikirim ke .

Berikut adalah contoh pengiriman pesan teks polos kepada pengguna dan perekaman informasi pesan setelah berhasil berkomunikasi dengan RBM API.

let params = {
    messageText: 'Hello, World!',
    msisdn:'+12223334444',
};

// Send "Hello, World!" to the user.
rbmApiHelper.sendMessage(params,
function(response) {
    // Extract the message ID from the response
    let messageId = response.config.params.messageId;

    // Store the sent state in the Datastore
    saveMessage(phoneNumber, messageId, false);
});

Setelah menjalankan kode, Anda dapat memeriksa Datastore dari Konsol Google Cloud dalam tampilan Entitas Datastore.

Datastore

Memperbarui status pengiriman pesan

Setelah agen Anda menyimpan permintaan pesan yang dikirim di Datastore, perbarui status pengiriman setelah pesan berhasil dikirim ke perangkat pengguna.

Pengguna perangkat mengirim peristiwa DELIVERED, READ, dan IS_TYPING ke agen RBM melalui Cloud Pub/Sub. Di pengendali untuk Pub/Sub, periksa peristiwa yang dikirim dan perbarui setelan Datastore untuk flag yang dikirim menjadi benar.

/**
 *   Uses the event received by the Pub/Sub subscription to send a
 *   response to the client's device.
 *   @param {object} userEvent The JSON object of a message
 *   received by the subscription.
 */
function handleMessage(userEvent) {
    if (userEvent.senderPhoneNumber != undefined) {
        let msisdn = userEvent.senderPhoneNumber;
        let messageId = userEvent.messageId;
        let eventType = userEvent.eventType;

        if(eventType === 'DELIVERED') {
            saveMessage(msisdn, messageId, true);
        }

        // TODO: Process message and create RBM response
    }
}

Agen menyimpan pesan keluar ke Datastore dan memperbarui data saat agen menerima notifikasi pengiriman. Di bagian selanjutnya, lihat cara menyiapkan cron tugas di App Engine Google agar berjalan setiap 10 menit untuk memantau iklan yang belum ditayangkan membuat pesan teks.

Cron di App Engine Google

Anda dapat menggunakan cron job untuk menjadwalkan tugas pada interval yang berbeda. Di App Engine Google, tugas cron dikonfigurasi dengan deskripsi, URL, dan interval.

Di aplikasi Node.js, Anda mengonfigurasinya dalam file cron.yaml, yang dapat di-deploy ke App Engine menggunakan Google Cloud SDK. Baca tentang penyiapan konfigurasi bahasa lainnya di Menjadwalkan tugas dengan cron.yaml.

Karena tugas cron memerlukan URL, Anda perlu menambahkan endpoint URL ke Express {i>router<i} aplikasi yang akan dipanggil oleh cron. Webhook ini bertanggung jawab untuk membuat kueri Datastore untuk pesan lama, menghapusnya dari platform RBM, dan mengirim kepada pengguna melalui SMS.

router.get('/expireMessages', function(req, res, next) {
    // TOOD: Query the Datastore for undelivered messages,
    // remove them from the RBM platform, and send them over SMS

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

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

cron:
-   description: "Processing expired RBM messages"
  url: /expireMessages
  schedule: every 10 mins

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

gcloud app deploy cron.yaml

Setelah deployment, App Engine secara otomatis mengonfigurasi tugas cron, dan tugas dapat dilihat di App Engine > Tugas cron.

cron job

Membuat kueri Datastore untuk pesan yang belum terkirim

Di webhook untuk tugas cron yang Anda siapkan di bagian sebelumnya, Anda perlu menambahkan logika untuk mencari semua pesan yang dikirim yang memiliki status delivered sama dengan salah dan yang memiliki waktu lastUpdated lebih lama dari waktu tunggu yang telah ditentukan sebelumnya yang sesuai untuk kasus penggunaan kita. Dalam contoh ini, masa berlaku pesan habis yang sudah lebih dari satu jam.

Untuk mendukung kueri gabungan seperti ini, Datastore harus memiliki indeks gabungan yang berisi properti delivered dan lastUpdated. Kepada lakukan ini, Anda dapat membuat file dalam project bernama index.yaml dengan informasi berikut:

indexes:
-   kind: Message
  properties:
  -   name: delivered
    direction: asc
  -   name: lastUpdated
    direction: desc

Serupa dengan men-deploy tugas cron yang Anda tentukan sebelumnya, gunakan Google Cloud SDK untuk men-deploy indeks gabungan yang Anda tentukan dengan perintah berikut:

gcloud datastore create-indexes index.yaml

Setelah deployment, App Engine otomatis mengonfigurasi indeks dan indeks ditampilkan di bagian Datastore > Indeks.

Indeks Datastore

Setelah indeks ditentukan, Anda dapat kembali ke webhook yang dibuat untuk tugas cron dan menyelesaikan logika masa berlaku pesan:

router.get('/expireMessages', function(req, res, next) {
    // Milliseconds in an hour
    const TIMEOUT = 3600000;

    // Threshold is current time minus one hour
    const OLD_MESSAGE_THRESHOLD = new Date().getTime() - TIMEOUT;

    // Create a query to find old undelivered messages
    const query = datastore
        .createQuery('Message')
        .filter('delivered', '=', false)
        .filter('lastUpdated', '<', OLD_MESSAGE_THRESHOLD);

    // Execute the query
    datastore.runQuery(query).then((results) => {
        for(var i = 0; i < results[0].length; i++) {
            let msisdn = results[0][i].msisdn;
            let messageId = results[0][i].id;

            // Stop the message from being sent
            rbmApiHelper.revokeMessage(msisdn, messageId);

            // Remove the message from the Datastore
            datastore.delete(results[0][i][datastore.KEY]);

            // TODO: Send the user the message as SMS
        }
    });

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

RBM tidak mendukung penggantian SMS secara native, sehingga Anda harus menerapkan logika untuk mengirim pesan yang tidak terkirim melalui SMS.

Rangkuman dan ringkasan

Untuk menangani pengguna offline, Anda dapat membuat logika pencabutan untuk RBM yang tidak terkirim membuat pesan teks. Jumlah waktu yang Anda gunakan sebelum masa berlaku pesan berakhir bergantung pada seberapa sensitif waktu informasi yang Anda kirimkan. Dengan informasi sensitif waktu, waktu tunggu yang direkomendasikan adalah kurang dari dua jam.

Contoh ini menggunakan Cloud Datastore dan Google App Engine untuk mengelola proses penyimpanan, kueri, dan pencabutan, tetapi mekanisme penyimpanan apa pun untuk melacak pesan yang dikirim dan diterima akan berfungsi.

Semoga berhasil, dan selamat melakukan coding.