ปัจจัยสำคัญของเวลานำส่งข้อความของตัวแทนคือ ผู้ใช้ที่คุณพยายามติดต่อมีการเชื่อมต่ออินเทอร์เน็ตขณะที่ตัวแทนของคุณ ส่งข้อความ หากผู้ใช้ออฟไลน์อยู่ แพลตฟอร์ม RBM จะจัดเก็บข้อความและพยายามนำส่งเป็นเวลาสูงสุด 30 วัน ถ้าไม่สามารถส่งข้อความภายในวันที่ ถูกนำออกจากระบบ
มีสาเหตุและสถานการณ์มากมายที่ผู้ใช้อาจไม่มีการเชื่อมต่อ เมื่อตัวแทนของคุณพยายามติดต่อตัวแทน บุตรหลานอาจปิดอินเทอร์เน็ตมือถือ จะประหยัดค่าใช้จ่ายด้วยแพ็กเกจมือถือ อาจอยู่บนเครื่องบินที่ไม่มี Wi-Fi หรืออาจจะอยู่บนรถไฟใต้ดินในอุโมงค์ ขึ้นอยู่กับความเร่งด่วน ข้อความที่จะส่ง ตัวแทนของคุณจะต้องจัดการ ผู้ใช้แบบออฟไลน์โดยเพิกถอนข้อความ RBM ที่ยังไม่ได้ส่ง และเปลี่ยนเส้นทางข้อความเหล่านั้นใหม่ ผ่านช่องทางอื่น
ส่วนต่อไปนี้แสดงรายละเอียดเกี่ยวกับวิธีใช้ Google Cloud Datastore เพื่อติดตามข้อความที่คุณส่งและนำส่ง วิธีใช้ cron เพื่อเพิกถอนข้อความที่ยังไม่ได้นำส่ง และวิธีกำหนดเส้นทางข้อความเหล่านั้นอีกครั้งผ่าน SMS
ติดตามข้อความที่ส่ง
ข้อความทุกข้อความที่ตัวแทน RBM ส่งต้องมีรหัสข้อความที่ไม่ซ้ำกัน หากต้องการติดตามข้อความที่ตัวแทนส่ง คุณต้องบันทึกรหัสข้อความ หมายเลขโทรศัพท์ และการประทับเวลาของแต่ละข้อความ
คุณใช้เทคโนโลยีต่างๆ เพื่อจัดเก็บข้อมูลนี้ได้ รวมถึง Google Cloud Datastore Cloud Datastore เป็นฐานข้อมูล NoSQL ที่ปรับขนาดได้สูงซึ่งจัดการการแยกส่วนและการทำซ้ำโดยอัตโนมัติ ซึ่งดีมาก สำหรับจัดเก็บข้อมูลที่ไม่ใช่แบบเชิงสัมพันธ์ เช่น ข้อความที่ตัวแทนส่ง Cloud Datastore ขึ้นอยู่กับทรัพยากรที่ใช้งานอยู่ Google App Engine เพื่อให้คุณ ใช้ App Engine เพื่อโฮสต์ Agent RBM ของคุณและกำหนดค่างาน cron
มีไลบรารีของไคลเอ็นต์สำหรับ Cloud Datastore ในหลายภาษา ในตัวอย่างนี้ คุณสามารถใช้ Node.js และตั้งค่าโค้ดตัวแทน RBM ตามตัวอย่าง Node.js ของตัวแทนแรกที่มีอยู่ในเว็บไซต์นักพัฒนาซอฟต์แวร์ RBM ในตอนแรก ติดตั้ง Cloud Datastore สำหรับโปรเจ็กต์ Node.js ของฉันโดยการเรียกใช้ คำสั่งต่อไปนี้
npm install --save @google-cloud/datastore
ในซอร์สโค้ดของ Agent ให้เพิ่มการอ้างอิงส่วนกลางไปยังไคลเอ็นต์ 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 และไลบรารีจะให้ออบเจ็กต์การตอบกลับใน Callback
ที่มี 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);
});
หลังจากเรียกใช้โค้ดแล้ว คุณสามารถตรวจสอบ Datastore จาก Google Cloud Console ภายในมุมมองเอนทิตี Datastore ได้
อัปเดตสถานะการนำส่งข้อความ
เมื่อตัวแทนจัดเก็บคําขอข้อความที่ส่งใน Datastore แล้ว ให้อัปเดตสถานะการนำส่งเมื่อส่งข้อความไปยังอุปกรณ์ของผู้ใช้เรียบร้อยแล้ว
อุปกรณ์ของผู้ใช้จะส่งเหตุการณ์ DELIVERED, READ และ IS_TYPING ไปยังตัวแทน RBM ผ่าน Cloud Pub/Sub ในเครื่องจัดการสำหรับ Pub/Sub ให้ตรวจหาเหตุการณ์ที่นำส่ง
และอัปเดตการตั้งค่า Datastore ให้แฟล็กที่ส่งเป็น "จริง"
/**
* 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 และอัปเดตข้อมูลเมื่อได้รับการแจ้งเตือนการนำส่ง ในส่วนถัดไป โปรดดูวิธีตั้งค่า cron ใน App Engine ของ Google เพื่อเรียกใช้ทุก 10 นาทีเพื่อตรวจสอบสถานะที่ไม่ได้ส่ง ข้อความ
Cron ใน App Engine ของ Google
คุณใช้งาน Cron เพื่อตั้งเวลางานในช่วงเวลาที่ต่างกันได้ ใน App Engine ของ Google ระบบจะกําหนดค่างาน cron ด้วยคําอธิบาย, URL และช่วงเวลา
ในแอป Node.js คุณกำหนดค่าเหล่านี้ได้ในไฟล์ cron.yaml ซึ่งนำไปทำให้ใช้งานได้
กับ App Engine โดยใช้ Google Cloud SDK
อ่านเกี่ยวกับการตั้งค่าการกำหนดค่าภาษาอื่นๆ ในการจัดกำหนดการงานด้วย
cron.yaml.
เนื่องจากงาน cron ต้องใช้ URL คุณต้องเพิ่มปลายทาง URL ไปยัง Express เราเตอร์แอปจะถูกเรียกโดย cron เว็บฮุคนี้มีหน้าที่ในการค้นหา Datastore สำหรับข้อความเก่า การลบออกจากแพลตฟอร์ม 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();
});
ต่อไปนี้เป็นการกำหนดค่าไฟล์ cron.yaml เพื่อเรียกใช้ปลายทางนี้ทุกๆ 10 นาที
cron:
- description: "Processing expired RBM messages"
url: /expireMessages
schedule: every 10 mins
หากต้องการทำให้งาน cron ใช้งานได้ใน App Engine ให้เรียกใช้คําสั่งต่อไปนี้
gcloud app deploy cron.yaml
หลังจากการทําให้ใช้งานได้ App Engine จะกําหนดค่างาน cron โดยอัตโนมัติ และคุณดูงานได้ในส่วน App Engine > งาน Cron
ค้นหาใน Datastore เพื่อหาข้อความที่ยังไม่ได้ส่ง
ในเว็บฮุคสำหรับงาน cron ที่คุณตั้งค่าไว้ในส่วนก่อนหน้านี้ คุณต้องเพิ่ม
ตรรกะในการค้นหาข้อความที่ส่งแล้วที่มีสถานะ delivered เท่ากับ "เท็จ"
และที่มีเวลานานกว่าระยะหมดเวลาที่กำหนดไว้ล่วงหน้า lastUpdated ครั้งซึ่งทำให้
สำหรับกรณีการใช้งานของเรา ในตัวอย่างนี้ ข้อความหมดอายุเกิน 1 ชั่วโมง
ในการสนับสนุนการค้นหาแบบผสมในลักษณะนี้ Datastore ต้องมีแอตทริบิวต์
ดัชนีผสมที่มีทั้งพร็อพเพอร์ตี้ delivered และ lastUpdated โดยสร้างไฟล์ในโปรเจ็กต์ชื่อ index.yaml ที่มีข้อมูลต่อไปนี้
indexes:
- kind: Message
properties:
- name: delivered
direction: asc
- name: lastUpdated
direction: desc
คล้ายกับการติดตั้งใช้งานงาน Cron ที่คุณกําหนดไว้ก่อนหน้านี้ ให้ใช้ Google Cloud SDK เพื่อติดตั้งใช้งานดัชนีคอมโพสิตที่คุณกําหนดด้วยคําสั่งต่อไปนี้
gcloud datastore create-indexes index.yaml
หลังจากทำให้ใช้งานได้แล้ว App Engine จะกำหนดค่าดัชนีและดัชนีโดยอัตโนมัติ จะแสดงในส่วน Datastore > ดัชนี
เมื่อกําหนดดัชนีแล้ว คุณสามารถกลับไปที่เว็บฮุคที่สร้างไว้สําหรับงาน cron และตั้งค่าตรรกะการหมดอายุของข้อความให้เสร็จสมบูรณ์ ดังนี้
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 โดยกำเนิด คุณจึงต้องใช้ตรรกะเพื่อส่งข้อความที่ส่งไม่สำเร็จผ่าน SMS
สรุปและสรุป
หากต้องการจัดการผู้ใช้ที่ออฟไลน์ คุณสามารถสร้างตรรกะการเพิกถอนสำหรับ RBM ที่ยังไม่ได้นำส่งได้ ข้อความ ระยะเวลาที่คุณใช้ก่อนที่จะทำให้ข้อความหมดอายุจะขึ้นอยู่กับความสำคัญของข้อมูลที่ส่ง ในกรณีที่เป็นข้อมูลที่มีเวลาจำกัด เราขอแนะนำให้ใช้การหมดเวลาน้อยกว่า 2 ชั่วโมง
ตัวอย่างนี้ใช้ Cloud Datastore และ Google App Engine เพื่อจัดการพื้นที่เก็บข้อมูล การค้นหา และกระบวนการเพิกถอน แต่กลไกพื้นที่เก็บข้อมูลใดๆ ก็ตามสำหรับติดตามข้อความที่ส่งและส่งแล้วก็ใช้ได้
ขอให้โชคดีและสนุกกับการเขียนโค้ด!