Một yếu tố quan trọng ảnh hưởng đến thời gian gửi tin nhắn của nhân viên hỗ trợ là liệu người dùng mà bạn đang cố gắng tiếp cận có kết nối dữ liệu tại thời điểm nhân viên hỗ trợ của bạn sẽ gửi tin nhắn. Nếu người dùng không có kết nối mạng, nền tảng RBM sẽ lưu trữ thông báo và cố gắng giao hàng trong vòng 30 ngày. Nếu không thể phân phối thư trước thời điểm đó, thư sẽ bị xoá khỏi hệ thống.
Có nhiều lý do và trường hợp khiến người dùng không có kết nối khi nhân viên hỗ trợ của bạn đang cố gắng liên hệ với họ. Họ có thể đã tắt dữ liệu để tiết kiệm tiền cho gói di động, có thể đang trên máy bay không có kết nối Wi-Fi hoặc có thể đang đi tàu điện ngầm trong đường hầm. Tuỳ thuộc vào mức độ khẩn cấp của tin nhắn cần gửi, nhân viên hỗ trợ của bạn cần xử lý khéo léo người dùng ngoại tuyến bằng cách thu hồi các tin nhắn RBM chưa được gửi và định tuyến lại các tin nhắn đó thông qua một kênh khác.
Các phần sau đây cung cấp thông tin chi tiết về cách sử dụng Google Cloud Datastore để theo dõi các tin nhắn mà bạn gửi và phân phối, cách sử dụng cron để thu hồi các tin nhắn chưa phân phối và cách định tuyến lại các tin nhắn đó thông qua SMS.
Theo dõi các tin nhắn đã gửi
Mỗi tin nhắn do nhân viên hỗ trợ RBM của bạn gửi phải có một mã tin nhắn duy nhất. Để theo dõi các tin nhắn mà nhân viên hỗ trợ gửi, bạn cần lưu mã tin nhắn, số điện thoại và dấu thời gian cho mỗi tin nhắn.
Bạn có thể sử dụng nhiều công nghệ để lưu trữ thông tin này, bao gồm kho dữ liệu Google Cloud. Cloud Datastore là một NoSQL có thể mở rộng ở mức độ cao tự động xử lý phân đoạn và sao chép. Thật tuyệt vời để lưu trữ dữ liệu phi quan hệ như các tin nhắn do một tác nhân gửi đi. Cloud Datastore phụ thuộc vào việc có một thực thể Google App Engine đang hoạt động, vì vậy, bạn có thể sử dụng App Engine để lưu trữ tác nhân RBM và định cấu hình công việc cron.
Có nhiều thư viện ứng dụng cho Cloud Datastore bằng nhiều ngôn ngữ. Trong ví dụ này, bạn có thể sử dụng Node.js và dựa vào mã tác nhân RBM trên Mẫu Node.js của tác nhân đầu tiên có trên Trang web dành cho nhà phát triển RBM. Lúc đầu, cài đặt Cloud Datastore cho dự án Node.js của tôi bằng cách chạy sau đây:
npm install --save @google-cloud/datastore
Trong mã nguồn của nhân viên hỗ trợ, hãy thêm một tệp tham chiếu chung đến ứng dụng Cloud Datastore thư viện của bạn.
// Imports the Google Cloud client library
const Datastore = require('@google-cloud/datastore');
// Creates a client
const datastore = new Datastore({
projectId: PROJECT_ID,
});
Khi tạo đối tượng kho dữ liệu, bạn có thể giới thiệu một hàm để lưu trữ
Trạng thái msisdn, message id, sent time và delivery cho mỗi thông báo.
/**
* 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);
});
}
Khi đã có hàm này, bạn cần gọi phương thức này bất cứ khi nào trợ lý gửi tin nhắn cho người dùng. Khi ứng dụng RBM Node.js
thư viện
gửi thông báo RBM, thư viện cung cấp một đối tượng phản hồi trong lệnh gọi lại
chứa messageId cho thông báo đã được gửi đến
người dùng.
Sau đây là ví dụ về cách gửi tin nhắn văn bản thuần tuý cho người dùng và ghi lại thông tin tin nhắn sau khi giao tiếp thành công với API RBM.
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);
});
Sau khi chạy mã, bạn có thể kiểm tra Datastore từ Cloud Console trong Thực thể Datastore chế độ xem.
Cập nhật trạng thái gửi tin nhắn
Giờ đây, nhân viên hỗ trợ của bạn lưu trữ các yêu cầu tin nhắn đã gửi trong Datastore, hãy cập nhật trạng thái gửi sau khi tin nhắn được gửi thành công đến thiết bị của người dùng.
Thông tin của người dùng thiết bị gửi sự kiện DELIVERED, READ và IS_TYPING cho nhân viên hỗ trợ RBM
qua Cloud Pub/Sub. Trong trình xử lý cho Pub/Sub, hãy kiểm tra các sự kiện đã phân phối
và cập nhật chế độ cài đặt Datastore cho cờ đã phân phối thành true.
/**
* 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
}
}
Nhân viên hỗ trợ lưu các tin nhắn đi vào Datastore và cập nhật dữ liệu khi sẽ nhận được thông báo phân phối. Trong phần tiếp theo, hãy xem cách thiết lập công việc cron trên App Engine của Google để chạy mỗi 10 phút nhằm theo dõi các thông báo chưa được phân phối.
Cron trên App Engine của Google
Bạn có thể sử dụng công việc cron để lên lịch tác vụ theo các khoảng thời gian khác nhau. Trong ứng dụng của Google Công cụ, một công việc chạy ngầm sẽ được định cấu hình bằng phần mô tả, URL và khoảng thời gian.
Trong các ứng dụng Node.js, bạn sẽ định cấu hình các tệp này trong tệp cron.yaml mà bạn có thể triển khai
lên App Engine bằng cách sử dụng Google Cloud SDK.
Hãy đọc về các chế độ thiết lập cấu hình ngôn ngữ khác trong phần Lên lịch công việc bằng cron.yaml.
Do tác vụ cron cần có URL, nên bạn cần thêm điểm cuối URL vào express bộ định tuyến ứng dụng được cron gọi. Webhook này chịu trách nhiệm truy vấn Datastore để tìm tin nhắn cũ, xoá các tin nhắn đó khỏi nền tảng RBM và gửi các tin nhắn đó cho người dùng qua 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();
});
Sau đây là cấu hình tệp cron.yaml để thực thi điểm cuối này 10 lần một lần phút.
cron:
- description: "Processing expired RBM messages"
url: /expireMessages
schedule: every 10 mins
Để triển khai tác vụ cron cho App Engine, hãy chạy lệnh sau:
gcloud app deploy cron.yaml
Sau khi triển khai, Công cụ ứng dụng sẽ tự động định cấu hình tác vụ cron và bạn có thể xem tác vụ đó trong phần Công cụ ứng dụng > Công việc cron.
Truy vấn Datastore đối với các thông báo chưa được gửi
Trong webhook cho công việc định kỳ mà bạn đã thiết lập trong phần trước, bạn cần thêm
logic để tra cứu tất cả tin nhắn đã gửi có trạng thái delivered bằng false
và có thời gian lastUpdated cũ hơn thời gian chờ xác định trước khiến
phù hợp với trường hợp sử dụng của chúng ta. Trong ví dụ này, các thư hết hạn được gửi đến sau một giờ.
Để hỗ trợ truy vấn tổng hợp như vậy, Datastore cần có một chỉ mục tổng hợp chứa cả thuộc tính delivered và lastUpdated. Để thực hiện việc này, bạn có thể tạo một tệp trong dự án có tên là index.yaml với thông tin sau:
indexes:
- kind: Message
properties:
- name: delivered
direction: asc
- name: lastUpdated
direction: desc
Tương tự như việc triển khai công việc cron mà bạn đã xác định trước đó, hãy sử dụng Google Cloud SDK để triển khai chỉ mục tổng hợp mà bạn đã xác định bằng lệnh sau:
gcloud datastore create-indexes index.yaml
Sau khi triển khai, Công cụ ứng dụng sẽ tự động định cấu hình chỉ mục và chỉ mục sẽ xuất hiện trong phần Datastore > Indexes (Kho dữ liệu > Chỉ mục).
Khi chỉ mục được xác định, bạn có thể quay lại webhook mà bạn đã tạo cho cron công việc và hoàn tất logic hết hạn thông báo:
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 không hỗ trợ tính năng dự phòng SMS ngay từ đầu, vì vậy, bạn cần triển khai logic để gửi các tin nhắn chưa gửi qua SMS.
Tổng kết và tóm tắt
Để xử lý người dùng ngoại tuyến, bạn có thể tạo logic thu hồi cho các thông báo RBM chưa được phân phối. Khoảng thời gian bạn sử dụng trước khi hết hạn tin nhắn phụ thuộc vào mức độ nhạy cảm về thời gian của thông tin bạn truyền. Với thông tin nhạy cảm về thời gian, thời gian chờ đề xuất là dưới 2 giờ.
Ví dụ này sử dụng Cloud Datastore và Google App Engine để quản lý bộ nhớ, truy vấn và quy trình thu hồi, nhưng bất kỳ cơ chế lưu trữ nào để theo dõi các tin nhắn bạn đã gửi và gửi sẽ hoạt động bình thường.
Chúc bạn may mắn và lập trình vui vẻ!