आपके एजेंट के मैसेज डिलीवर होने में लगने वाले समय पर, यह बात काफ़ी असर डालती है कि जिस उपयोगकर्ता से संपर्क करने की कोशिश की जा रही है उसके पास मैसेज भेजने के समय इंटरनेट कनेक्शन है या नहीं. अगर उपयोगकर्ता ऑफ़लाइन है, तो RBM प्लैटफ़ॉर्म मैसेज को सेव कर लेता है और 30 दिनों तक उसे डिलीवर करने की कोशिश करता है. अगर इस तारीख तक मैसेज डिलीवर नहीं होता, तो उसे सिस्टम से हटा दिया जाता है.
किसी उपयोगकर्ता के पास कनेक्टिविटी न होने की कई वजहें और स्थितियां हो सकती हैं जब आपका एजेंट उनसे संपर्क करने की कोशिश करता है. वे शायद डेटा बंद कर सकते थे मोबाइल प्लान पर पैसे बचाने के लिए, हो सकता है कि वे वाई-फ़ाई के बिना हवाई जहाज़ में यात्रा कर रहे हों या शायद किसी सुरंग में सबवे में हैं. आपके मैसेज कितने ज़रूरी हैं, इस आधार पर आपके एजेंट को ऑफ़लाइन उपयोगकर्ताओं को मैसेज भेजने के लिए, डिलीवर नहीं किए गए आरबीएम मैसेज रद्द करने और उन मैसेज को किसी दूसरे चैनल से फिर से भेजने की ज़रूरत होती है.
नीचे दिए सेक्शन में, Google Cloud Datastore कौनसे मैसेज भेजे और डिलीवर किए जाते हैं, Chrome का इस्तेमाल कैसे करें रद्द करें डिलीवर नहीं हुए मैसेज और उन मैसेज को एसएमएस के ज़रिए फिर से रूट करने का तरीका.
भेजे गए मैसेज का ट्रैक रखना
आपके आरबीएम एजेंट की ओर से भेजे जाने वाले हर मैसेज में, एक यूनीक मैसेज आईडी शामिल होना चाहिए. अपने एजेंट के भेजे गए मैसेज को ट्रैक करने के लिए, आपको मैसेज आईडी सेव करना होगा, फ़ोन नंबर, और हर मैसेज के लिए टाइमस्टैंप है.
इस जानकारी को सेव करने के लिए, कई तरह की टेक्नोलॉजी का इस्तेमाल किया जा सकता है. इनमें Google Cloud डेटास्टोर भी शामिल है. Cloud Datastore, स्केल करने लायक एक NoSQL डेटाबेस है. यह अपने-आप शर्डिंग और डुप्लीकेट कॉपी बनाने की सुविधा देता है. यह बहुत बढ़िया है इस तरह के एक समाधान की तरह भी है. Cloud Datastore के लिए Google App Engine इंस्टेंस, ताकि आप इनका इस्तेमाल कर सकें अपने आरबीएम एजेंट को होस्ट करने और क्रॉन जॉब कॉन्फ़िगर करने के लिए, App Engine का इस्तेमाल करें.
Cloud Datastore के लिए क्लाइंट लाइब्रेरी कई भाषाओं में उपलब्ध है. इसके लिए इस उदाहरण में, Node.js का इस्तेमाल करके RBM एजेंट कोड को पहले एजेंट Node.js का सैंपल यह जानकारी, आरबीएम डेवलपर वेबसाइट पर उपलब्ध है. सबसे पहले, मेरे Node.js प्रोजेक्ट के लिए Cloud Datastore इंस्टॉल करने के लिए निम्न आदेश:
npm install --save @google-cloud/datastore
अपने एजेंट के सोर्स कोड में, 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 क्लाइंट लाइब्रेरी, आरबीएम मैसेज भेजती है, तो लाइब्रेरी कॉलबैक तरीके में एक रिस्पॉन्स ऑब्जेक्ट देती है. इसमें उपयोगकर्ता को भेजे गए मैसेज के लिए 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 Cloud Console में डेटास्टोर इकाइयां व्यू में जाकर, डेटास्टोर की जांच की जा सकती है.
मैसेज की डिलीवरी की स्थिति अपडेट करना
आपका एजेंट, भेजे गए मैसेज के अनुरोधों को डेटास्टोर में सेव करता है. इसलिए, जब मैसेज उपयोगकर्ता के डिवाइस पर डिलीवर हो जाए, तो डिलीवरी की स्थिति अपडेट करें.
उपयोगकर्ताओं के डिवाइस, Cloud Pub/Sub के ज़रिए 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
}
}
एजेंट, आउटगोइंग मैसेज को Datastore में सेव करता है और जब डेटा को अपडेट करता है, तब वह डिलीवरी की सूचना मिलती है. अगले सेक्शन में, Google के App Engine पर क्रॉन जॉब सेट अप करने का तरीका जानें. इससे, डिलीवर न किए गए मैसेज को मॉनिटर करने के लिए, हर 10 मिनट में क्रॉन जॉब चलेगा.
Google के App Engine पर क्रॉन
अलग-अलग इंटरवल में टास्क शेड्यूल करने के लिए, क्रॉन जॉब का इस्तेमाल किया जा सकता है. Google के App Engine में, क्रॉन जॉब को जानकारी, यूआरएल, और इंटरवल के साथ कॉन्फ़िगर किया जाता है.
Node.js ऐप्लिकेशन में, इन्हें cron.yaml फ़ाइल में कॉन्फ़िगर किया जाता है. इस फ़ाइल को Google Cloud SDK का इस्तेमाल करके, App Engine में डिप्लॉय किया जा सकता है.
cron.yaml की मदद से जॉब शेड्यूल करना लेख में, भाषा के अन्य कॉन्फ़िगरेशन सेटअप के बारे में पढ़ें.
क्रॉन टास्क के लिए यूआरएल की ज़रूरत होती है. इसलिए, आपको एक्सप्रेस ऐप्लिकेशन राउटर में यूआरएल एंडपॉइंट जोड़ना होगा, ताकि क्रॉन उसे कॉल कर सके. यह वेबहुक, पुराने मैसेज का डेटा स्टोर करने के लिए, आरबीएम प्लैटफ़ॉर्म से मैसेज मिटाने और भेजने के लिए उन्हें एसएमएस के ज़रिए उपयोगकर्ता को भेजा जा सकता है.
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
App Engine में क्रॉन टास्क डिप्लॉय करने के लिए, यह कमांड चलाएं:
gcloud app deploy cron.yaml
डिप्लॉयमेंट के बाद, App Engine क्रॉन टास्क को अपने-आप कॉन्फ़िगर कर देता है. साथ ही, टास्क को App Engine > क्रॉन जॉब में देखा जा सकता है.
डिलीवर नहीं हुए मैसेज के लिए डेटास्टोर से क्वेरी करना
पिछले सेक्शन में सेट अप किए गए क्रॉन जॉब के वेबहुक में, आपको
भेजे गए उन सभी मैसेज को देखने के लिए लॉजिक जिनके delivered स्टेटस 'गलत' के बराबर है
और जिसका टाइम आउट पहले से तय किए गए समय से lastUpdated गुना ज़्यादा पुराना है.
हमारे इस्तेमाल के उदाहरण के लिए
समझदारी करें. इस उदाहरण में, एक घंटे से पुराने मैसेज की समयसीमा खत्म हो जाएगी.
इस तरह की कंपोज़िट क्वेरी की सुविधा देने के लिए, Datastore को
कंपोज़िट इंडेक्स में delivered और lastUpdated, दोनों प्रॉपर्टी शामिल हैं. यहां की यात्रा पर हूं
ऐसा करने के बाद, आप अपने प्रोजेक्ट में index.yaml नाम की एक फ़ाइल बना सकते हैं
नीचे दी गई जानकारी:
indexes:
- kind: Message
properties:
- name: delivered
direction: asc
- name: lastUpdated
direction: desc
पहले तय किए गए क्रॉन जॉब को डिप्लॉय करने की तरह ही, Google Cloud का इस्तेमाल करें SDK टूल उस कंपोज़िट इंडेक्स को डिप्लॉय करेगा जिसे आपने नीचे दिए गए निर्देश से तय किया है:
gcloud datastore create-indexes index.yaml
डिप्लॉयमेंट के बाद, ऐप्लिकेशन इंजन, इंडेक्स और इंडेक्स को अपने-आप कॉन्फ़िगर करता है Datastore > में दिखाया गया है इंडेक्स.
इंडेक्स तय होने पर, उस वेबहुक पर वापस जा सकते हैं जिसे आपने क्रॉन के लिए बनाया था जॉब और मैसेज की समयसीमा खत्म होने का लॉजिक पूरा करें:
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 में, एसएमएस फ़ॉलबैक की सुविधा डिफ़ॉल्ट रूप से काम नहीं करती. इसलिए, आपको एसएमएस के ज़रिए वे मैसेज भेजने के लिए लॉजिक लागू करना होगा जो डिलीवर नहीं हो पाए हैं.
आखिर में खास जानकारी
अगर आपको ऑफ़लाइन उपयोगकर्ताओं को मैनेज करना है, तो डिलीवर नहीं किए गए आरबीएम के लिए सहमति रद्द करने का लॉजिक बनाएं मैसेज. संदेश की समय-सीमा खत्म होने से पहले आपके द्वारा उपयोग किया जाने वाला समय इस पर निर्भर करता है जो जानकारी आप भेज रहे हैं, वह कितनी समय के लिए संवेदनशील है. समय के हिसाब से संवेदनशील तो हमारा सुझाव है कि टाइम आउट दो घंटे से कम का हो.
इस उदाहरण में, स्टोरेज, क्वेरी, और रद्द करने की प्रोसेस को मैनेज करने के लिए, Cloud Datastore और Google App Engine का इस्तेमाल किया गया है. हालांकि, भेजे गए और डिलीवर किए गए मैसेज का ट्रैक रखने के लिए, स्टोरेज का कोई भी तरीका काम करेगा.
शुभकामनाएं, और कोडिंग करते रहें!