আপনার RBM প্রচারাভিযানে অফলাইন ব্যবহারকারীদের কীভাবে পরিচালনা করবেন

আপনার এজেন্টের বার্তাগুলির জন্য ডেলিভারি সময়ের একটি প্রধান কারণ হল যে ব্যবহারকারীর কাছে আপনি পৌঁছানোর চেষ্টা করছেন আপনার এজেন্ট একটি বার্তা পাঠানোর সময় তার ডেটা সংযোগ আছে কিনা৷ ব্যবহারকারী অফলাইনে থাকলে, RBM প্ল্যাটফর্ম বার্তাটি সঞ্চয় করে এবং 30 দিন পর্যন্ত ডেলিভারির চেষ্টা করে। যদি বার্তাটি ততক্ষণে বিতরণ করা না যায় তবে এটি সিস্টেম থেকে সরানো হবে।

আপনার এজেন্ট যখন তাদের সাথে যোগাযোগ করার চেষ্টা করছে তখন ব্যবহারকারীর সংযোগ নাও থাকতে পারে এমন অনেক কারণ এবং পরিস্থিতি রয়েছে। তারা তাদের মোবাইল প্ল্যানে অর্থ সঞ্চয় করার জন্য ডেটা বন্ধ করে দিতে পারে, একটি Wi-Fi সংযোগ ছাড়াই একটি বিমানে থাকতে পারে বা সম্ভবত একটি টানেলে একটি পাতাল রেলে থাকতে পারে৷ আপনার বার্তাগুলি যে জরুরীতার সাথে পৌঁছাতে হবে তার উপর নির্ভর করে, আপনার এজেন্টকে অফলাইন ব্যবহারকারীদের অবিলম্বিত RBM বার্তাগুলি প্রত্যাহার করে এবং একটি ভিন্ন চ্যানেলের মাধ্যমে সেই বার্তাগুলিকে পুনরায় রুট করার মাধ্যমে সুন্দরভাবে পরিচালনা করতে হবে৷

এই প্রবন্ধে, আমি আপনাকে দেখাব কিভাবে একটি Google ক্লাউড ডেটাস্টোর ব্যবহার করে আপনি যে বার্তাগুলি পাঠান এবং বিতরণ করেন সেগুলির ট্র্যাক রাখতে, কীভাবে অবিলম্বিত বার্তাগুলি প্রত্যাহার করতে ক্রোন ব্যবহার করতে হয় এবং কীভাবে সেই বার্তাগুলিকে এসএমএসের মাধ্যমে পুনরায় রুট করতে হয়৷

পাঠানো বার্তা ট্র্যাক রাখা

আপনার RBM এজেন্ট দ্বারা প্রেরিত প্রতিটি বার্তায় একটি অনন্য বার্তা আইডি থাকতে হবে। আপনার এজেন্ট যে বার্তাগুলি পাঠায় তার ট্র্যাক রাখতে, আপনাকে প্রতিটি বার্তার জন্য বার্তা আইডি, ফোন নম্বর এবং টাইমস্ট্যাম্প সংরক্ষণ করতে হবে।

আপনি এই তথ্য সংরক্ষণ করতে বিভিন্ন প্রযুক্তি ব্যবহার করতে পারেন, কিন্তু এই নিবন্ধে আমি একটি Google ক্লাউড ডেটাস্টোর ব্যবহার করি। ক্লাউড ডেটাস্টোর হল একটি অত্যন্ত স্কেলযোগ্য NoSQL ডাটাবেস যা স্বয়ংক্রিয়ভাবে শার্ডিং এবং প্রতিলিপি পরিচালনা করে। এটি একটি এজেন্ট দ্বারা প্রেরিত বার্তাগুলির মতো সম্পর্কহীন ডেটা সংরক্ষণের জন্য একটি দুর্দান্ত সমাধান। ক্লাউড ডেটাস্টোর একটি সক্রিয় Google অ্যাপ ইঞ্জিন ইনস্ট্যান্স থাকার উপর নির্ভর করে, তাই আমি আমার RBM এজেন্ট হোস্ট করতে এবং একটি ক্রোন কাজ কনফিগার করতে অ্যাপ ইঞ্জিন ব্যবহার করি।

ক্লাউড ডেটাস্টোরের জন্য ক্লায়েন্ট লাইব্রেরি অনেক ভাষায় উপলব্ধ। এই উদাহরণের জন্য, আমি Node.js ব্যবহার করি এবং RBM ডেভেলপার ওয়েবসাইটে উপলব্ধ ফার্স্ট এজেন্ট Node.js নমুনার উপর RBM এজেন্ট কোড বেস করি। আমি প্রথম যে কাজটি করি তা হল নিম্নলিখিত কমান্ডটি চালিয়ে আমার Node.js প্রকল্পের জন্য ক্লাউড ডেটাস্টোর ইনস্টল করা:

npm install --save @google-cloud/datastore

আমার এজেন্ট সোর্স কোডে, আমি ক্লাউড ডেটাস্টোর ক্লায়েন্ট লাইব্রেরিতে একটি বিশ্বব্যাপী রেফারেন্স যোগ করি।

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

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

ডেটাস্টোর অবজেক্ট তৈরি করে, আমি প্রতিটি বার্তার জন্য msisdn , message id , sent time এবং delivery অবস্থা সংরক্ষণ করার জন্য একটি ফাংশন প্রবর্তন করি।

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

এই ফাংশনটি চালু রেখে, যখনই আপনার এজেন্ট কোনো ব্যবহারকারীকে একটি বার্তা পাঠান তখনই আপনাকে এই পদ্ধতিতে কল করতে হবে। যখন RBM Node.js ক্লায়েন্ট লাইব্রেরি RBM বার্তা পাঠায়, তখন লাইব্রেরি কলব্যাক পদ্ধতিতে একটি প্রতিক্রিয়া অবজেক্ট সরবরাহ করে যাতে ব্যবহারকারীকে পাঠানো বার্তাটির messageId থাকে।

নীচে একজন ব্যবহারকারীকে একটি সাধারণ পাঠ্য বার্তা পাঠানোর এবং 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);
});

উপরের কোডটি চালানোর পরে, আপনি ডেটাস্টোর এন্টিটি ভিউয়ের মধ্যে Google ক্লাউড কনসোল থেকে ডেটাস্টোর পরিদর্শন করতে পারেন।

অস্ত্রোপচার

বার্তাগুলির ডেলিভারি অবস্থা আপডেট করা হচ্ছে

এখন যেহেতু আপনার এজেন্ট ডেটাস্টোরে মেসেজ রিকোয়েস্ট পাঠিয়েছে, বার্তাটি সফলভাবে ব্যবহারকারীর ডিভাইসে পৌঁছে গেলে আমাদের ডেলিভারি স্ট্যাটাস আপডেট করতে হবে।

ব্যবহারকারীদের ডিভাইস ক্লাউড পাব/সাব-এর মাধ্যমে RBM এজেন্টদের DELIVERED , READ এবং IS_TYPING ইভেন্ট পাঠায়। Pub/Sub-এর জন্য হ্যান্ডলারে, বিতরণ করা ইভেন্টগুলি পরীক্ষা করুন এবং বিতরণ করা পতাকার জন্য ডেটাস্টোর সেটিংস সত্যে আপডেট করুন।

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

এজেন্ট বহির্গামী বার্তাগুলি ডেটাস্টোরে সংরক্ষণ করে এবং যখন এটি একটি বিতরণ বিজ্ঞপ্তি পায় তখন ডেটা আপডেট করে। পরবর্তী বিভাগে, আমরা Google-এর অ্যাপ ইঞ্জিনে একটি ক্রোন জব সেট আপ করি যাতে বিতরণ না করা বার্তাগুলি নিরীক্ষণ করার জন্য প্রতি 10 মিনিটে চালানো যায়।

গুগলের অ্যাপ ইঞ্জিনে ক্রোন

আপনি বিভিন্ন ব্যবধানে কাজগুলি নির্ধারণ করতে ক্রোন কাজগুলি ব্যবহার করতে পারেন। Google এর অ্যাপ ইঞ্জিনে, একটি ক্রোন কাজ একটি বিবরণ, একটি URL এবং একটি ব্যবধান সহ কনফিগার করা হয়৷

Node.js অ্যাপে, আপনি এগুলিকে একটি cron.yaml ফাইলে কনফিগার করেন, যা আপনি Google Cloud SDK ব্যবহার করে অ্যাপ ইঞ্জিনে স্থাপন করতে পারেন। cron.yaml-এর মাধ্যমে কাজের সময় নির্ধারণে অন্যান্য ভাষার কনফিগারেশন সেটআপ সম্পর্কে পড়ুন।

যেহেতু ক্রন টাস্কের জন্য একটি URL প্রয়োজন, তাই আপনাকে এক্সপ্রেস অ্যাপ রাউটারে একটি URL এন্ডপয়েন্ট যোগ করতে হবে যাতে ক্রন দ্বারা কল করা হয়। এই ওয়েবহুকটি পুরানো বার্তাগুলির জন্য ডেটাস্টোরে অনুসন্ধান করার জন্য, সেগুলিকে RBM প্ল্যাটফর্ম থেকে মুছে ফেলার জন্য এবং ব্যবহারকারীকে 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();
});

নীচে প্রতি 10 মিনিটে এই এন্ডপয়েন্টটি চালানোর জন্য cron.yaml ফাইল কনফিগারেশন রয়েছে।

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

অ্যাপ ইঞ্জিনে ক্রোন কাজগুলি স্থাপন করতে, নিম্নলিখিত কমান্ডটি চালান:

gcloud app deploy cron.yaml

স্থাপনের পরে, অ্যাপ ইঞ্জিন স্বয়ংক্রিয়ভাবে ক্রোন টাস্কটি কনফিগার করে, এবং টাস্কটি অ্যাপ ইঞ্জিন > ক্রন কাজগুলির অধীনে দেখা যায়।

ক্রন কাজ

বিতরণ না করা বার্তাগুলির জন্য ডেটাস্টোরে অনুসন্ধান করা হচ্ছে

আগের বিভাগে আপনি যে ক্রন কাজের সেট আপ করেছেন তার ওয়েবহুকে, আপনাকে সমস্ত প্রেরিত বার্তাগুলি সন্ধান করার জন্য যুক্তি যোগ করতে হবে যেগুলির delivered অবস্থা মিথ্যার সমান এবং যেগুলির একটি পূর্বনির্ধারিত সময়সীমার চেয়ে পুরানো lastUpdated সময় যা আমাদের জন্য অর্থপূর্ণ ব্যবহারের ক্ষেত্রে. এই উদাহরণে, এক ঘণ্টার বেশি পুরনো বার্তার মেয়াদ শেষ হয়ে যায়।

এই ধরনের একটি যৌগিক ক্যোয়ারী সমর্থন করার জন্য, ডেটাস্টোরের একটি যৌগিক সূচক থাকতে হবে যাতে delivered এবং lastUpdated বৈশিষ্ট্য উভয়ই থাকে৷ এটি করার জন্য, আপনি নিম্নলিখিত তথ্য সহ index.yaml নামে আপনার প্রকল্পে একটি ফাইল তৈরি করতে পারেন:

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

আপনি পূর্বে সংজ্ঞায়িত ক্রন জব স্থাপনের অনুরূপ, নিম্নলিখিত কমান্ডের সাথে আপনার সংজ্ঞায়িত যৌগিক সূচী স্থাপন করতে Google ক্লাউড SDK ব্যবহার করুন:

gcloud datastore create-indexes index.yaml

স্থাপনের পরে, অ্যাপ ইঞ্জিন স্বয়ংক্রিয়ভাবে সূচকটি কনফিগার করে এবং সূচকটি ডেটাস্টোর > সূচীগুলির অধীনে দেখা যায়।

ডেটাস্টোর সূচক

সংজ্ঞায়িত সূচকের সাথে, আমরা ক্রোন কাজের জন্য আপনার তৈরি করা ওয়েবহুকে ফিরে যেতে পারি এবং বার্তার মেয়াদ শেষ হওয়ার যুক্তি সম্পূর্ণ করতে পারি:

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-এর মাধ্যমে আপনার অবিকৃত বার্তা পাঠাতে যুক্তি প্রয়োগ করতে হবে।

মোড়ানো এবং TL;DR

অফলাইন ব্যবহারকারীদের পরিচালনা করতে, আপনি বিতরণ না করা RBM বার্তাগুলির জন্য প্রত্যাহার যুক্তি তৈরি করতে পারেন। বার্তার মেয়াদ শেষ হওয়ার আগে আপনি কতটা সময় ব্যবহার করেন তা নির্ভর করে আপনার পাঠানো তথ্য কতটা সময়-সংবেদনশীল তার উপর। সময়-সংবেদনশীল তথ্য সহ, আমরা দুই ঘণ্টার কম সময়সীমার সুপারিশ করি।

এই উদাহরণটি স্টোরেজ, ক্যোয়ারী এবং প্রত্যাহার প্রক্রিয়া পরিচালনা করতে একটি ক্লাউড ডেটাস্টোর এবং Google অ্যাপ ইঞ্জিন ব্যবহার করে, তবে আপনার পাঠানো এবং বিতরণ করা বার্তাগুলির ট্র্যাক রাখার জন্য যেকোন স্টোরেজ প্রক্রিয়া কাজ করা উচিত।

শুভকামনা, এবং সুখী কোডিং!