RBM kampanyalarınızda çevrimdışı kullanıcılarla ilgilenme

Temsilcinizin mesajlarının teslim edilmesinde önemli bir faktör, ulaşmaya çalıştığınız kullanıcının aracınızın mesaj gönderdiği sırada veri bağlantısının olup olmamasıdır. Kullanıcı çevrimdışıysa RBM platformu mesajı depolar ve 30 güne kadar teslim etmeyi dener. Mesaj bu süre içinde teslim edilemezse sistemden kaldırılır.

Temsilciniz kendisiyle iletişime geçmeye çalışırken kullanıcının bağlantısının kesilmesine yol açabilecek birçok neden ve durum vardır. Mobil tarifelerinde paradan tasarruf etmek için verileri devre dışı bırakabilir, kablosuz bağlantısı olmayan bir uçakta veya tünelde bir metroda geçirebilirlerdi. Mesajlarınızın ulaşması gereken aciliyete bağlı olarak temsilcinizin, teslim edilmeyen RBM mesajlarını iptal edip bu mesajları farklı bir kanal üzerinden yeniden yönlendirerek çevrimdışı kullanıcılarla sorunsuz bir şekilde ilgilenmesi gerekir.

Bu makalede, gönderdiğiniz ve gönderdiğiniz mesajları takip etmek için Google Cloud Datastore'un nasıl kullanılacağını, teslim edilmeyen mesajları revoke için cron'un nasıl kullanılacağını ve bu mesajları SMS ile nasıl yeniden yönlendireceğinizi göstereceğim.

Gönderilen iletileri takip etme

RBM temsilciniz tarafından gönderilen her mesaj benzersiz bir mesaj kimliği içermelidir. Temsilcinizin gönderdiği mesajları takip etmek için her mesajın mesaj kimliğini, telefon numarasını ve zaman damgasını kaydetmeniz gerekir.

Bu bilgileri depolamak için çeşitli teknolojilerden yararlanabilirsiniz; ancak bu makalede bir Google Cloud Datastore kullanıyorum. Cloud Datastore, parçalama ve çoğaltma işlemlerini otomatik olarak gerçekleştiren, yüksek düzeyde ölçeklenebilir bir NoSQL veritabanıdır. Temsilciler tarafından gönderilen mesajlar gibi ilişkisel olmayan verileri depolamak için mükemmel bir çözümdür. Cloud Datastore, etkin bir Google App Engine örneğine bağlı olduğundan RBM aracımı barındırmak ve bir cron işi yapılandırmak için App Engine'i kullanıyorum.

Cloud Datastore için birçok dilde kullanılabilen istemci kitaplıkları vardır. Bu örnekte, Node.js'yi kullanıyorum. Ayrıca, RBM aracı kodunu RBM Geliştirici Web Sitesinde bulunan First Agent Node.js Örneği'ne dayandırıyorum. İlk olarak aşağıdaki komutu çalıştırarak Node.js projem için Cloud Datastore'u yükleyin:

npm install --save @google-cloud/datastore

Aracı kaynak kodumda, Cloud Datastore istemci kitaplığına global referans ekliyorum.

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

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

Veri deposu nesnesi oluşturulduktan sonra her mesaj için msisdn, message id, sent time ve delivery durumunu depolayacak bir işlev sunuyorum.

/**
 *   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);
        });
}

Bu işlev etkinken, aracınız bir kullanıcıya her mesaj gönderdiğinde bu yöntemi çağırmanız gerekir. RBM Node.js istemci kitaplığı RBM mesajları gönderdiğinde kitaplık, geri çağırma yönteminde kullanıcıya gönderilen mesaj için messageId içeren bir yanıt nesnesi sağlar.

Aşağıda, bir kullanıcıya düz kısa mesaj gönderme ve RBM API ile başarılı bir şekilde iletişim kurduktan sonra mesaj bilgilerini kaydetmeyle ilgili bir örnek verilmiştir.

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

Yukarıdaki kodu çalıştırdıktan sonra Datastore Varlıkları görünümündeki Google Cloud Console'dan Datastore'u inceleyebilirsiniz.

Datastore

İletilerin teslim durumunu güncelleme

Aracınız gönderilen mesaj isteklerini Datastore'da depoladığından, mesaj kullanıcının cihazına başarıyla teslim edildikten sonra teslim durumunu güncellememiz gerekir.

Kullanıcı cihazları DELIVERED, READ ve IS_TYPING etkinliklerini Cloud Pub/Sub üzerinden RBM aracılarına gönderir. Pub/Sub işleyicisinde, yayınlanan etkinlikleri kontrol edin ve yayınlanan işareti için Datastore ayarını "true" (doğru) değerine güncelleyin.

/**
 *   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
    }
}

Aracı, giden mesajları Datastore'a kaydeder ve teslim bildirimi aldığında verileri günceller. Bir sonraki bölümde, Google'ın App Engine'inde, teslim edilmeyen mesajları izlemek için 10 dakikada bir çalışacak bir cron işi ayarlıyoruz.

Google'ın App Engine'inde Cron

Cron işlerini farklı aralıklarla görevler planlamak için kullanabilirsiniz. Google'ın App Engine'inde açıklama, URL ve aralık içeren bir cron işi yapılandırılır.

Node.js uygulamalarında bunları bir cron.yaml dosyasında yapılandırırsınız. Bu dosyayı, Google Cloud SDK'sını kullanarak App Engine'e dağıtabilirsiniz. cron.yaml ile iş planlama bölümünden diğer dil yapılandırma ayarları hakkında bilgi edinebilirsiniz.

Cron görevi için bir URL gerektiğinden, cron tarafından çağrılacak ekspres uygulama yönlendiricisine bir URL uç noktası eklemeniz gerekir. Bu webhook; eski mesajları sorgulamak, RBM platformundan silmek ve SMS üzerinden kullanıcıya göndermekten sorumludur.

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

Aşağıda, bu uç noktayı 10 dakikada bir yürütmek için kullanılacak cron.yaml dosya yapılandırması bulunmaktadır.

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

Cron görevlerini App Engine'e dağıtmak için aşağıdaki komutu çalıştırın:

gcloud app deploy cron.yaml

Dağıtımdan sonra App Engine, cron görevini otomatik olarak yapılandırır ve görev, App Engine > Cron işleri altında görüntülenebilir.

cron işleri

Veri deposunu teslim edilmeyen mesajlar için sorgulama

Önceki bölümde ayarladığınız cron işinin webhook'unda, delivered durumu "false" (yanlış) değerine eşit olan ve kullanım alanımız açısından mantıklı olan önceden tanımlanmış bir zaman aşımından lastUpdated süre daha eski olan tüm gönderilmiş mesajları aramak için mantık eklemeniz gerekir. Bu örnekte, bir saatten daha eski iletilerin süresi dolar.

Bunun gibi birleşik bir sorguyu desteklemek için Datastore'un hem delivered hem de lastUpdated özelliklerini içeren birleşik bir dizine sahip olması gerekir. Bunun için projenizde aşağıdaki bilgilerle index.yaml adlı bir dosya oluşturabilirsiniz:

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

Daha önce tanımladığınız cron işini dağıtmaya benzer şekilde, aşağıdaki komutla tanımladığınız bileşik dizini dağıtmak için Google Cloud SDK'yı kullanın:

gcloud datastore create-indexes index.yaml

Dağıtımdan sonra App Engine, dizini otomatik olarak yapılandırır ve dizin, Datastore > Dizinler bölümünde görüntülenebilir.

Datastore Dizinleri

Dizin tanımlandıktan sonra, cron işi için oluşturduğunuz webhook'a geri dönebilir ve mesaj geçerlilik sonu mantığını tamamlayabiliriz:

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, SMS yedeğini yerleşik olarak desteklemez. Bu nedenle, teslim edilmeyen mesajlarınızı SMS üzerinden gönderme mantığını uygulamanız gerekir.

Özet ve özet

Çevrimdışı kullanıcıları yönetmek için teslim edilmeyen RBM mesajlarında iptal mantığı oluşturabilirsiniz. Mesajın süresi dolmadan önce kullanabileceğiniz süre, ilettiğiniz bilgilerin zaman duyarlılığına bağlıdır. Zamana duyarlı bilgilerde iki saatten kısa zaman aşımı olmasını öneririz.

Bu örnekte depolama, sorgu ve iptal sürecini yönetmek için Cloud Datastore ve Google App Engine kullanılmaktadır. Ancak gönderilen ve teslim edilen mesajlarınızı takip etmeye yarayan tüm depolama mekanizmaları çalışır.

İyi şanslar, iyi kodlamalar!