エージェントのメッセージの配信時間を決定する主な要因は、 エージェントが接続していたときに、そのユーザーが メッセージが送信されます。ユーザーがオフラインの場合、RBM プラットフォームはメッセージを保存し、最大 30 日間配信を試みます。その時間までにメッセージを配信できない場合は、システムから削除されます。
ユーザーが接続できない理由や状況は数多くあります エージェントが連絡しようとしたときに通知を受け取れますモバイルプランの費用を節約するためにデータ通信をオフにしている場合や、Wi-Fi に接続できない飛行機内にいる場合、トンネル内の地下鉄にいる場合などです。緊急度に応じて 受信するメッセージに 到達するには 未配信の RBM メッセージを取り消して、それらのメッセージを再ルーティングして、オフライン ユーザーに届ける 別のチャネル経由で行われます
以降のセクションでは、 Google Cloud Datastore cron を使用して 取り消す それらのメッセージを SMS で再ルーティングする方法について学びました。
送信したメッセージを追跡する
RBM エージェントによって送信されるすべてのメッセージには、一意のメッセージ ID が含まれている必要があります。 エージェントが送信したメッセージを追跡するには、各メッセージのメッセージ ID、電話番号、タイムスタンプを保存する必要があります。
この情報は、Google Cloud Datastore など、さまざまなテクノロジーを使用して保存できます。Cloud Datastore はスケーラビリティに優れた NoSQL シャーディングとレプリケーションを自動的に処理する フルマネージドデータベースサービスですエージェントから送信されたメッセージなどの非リレーショナル データを保存するのに適したソリューションです。Cloud Datastore はアクティブな Google App Engine インスタンスに依存しているため、App Engine を使用して RBM エージェントをホストし、cron ジョブを構成できます。
Cloud Datastore には、さまざまな言語に対応したクライアント ライブラリが用意されています。この例では、Node.js を使用して、RBM デベロッパー ウェブサイトで入手できる First Agent Node.js Sample に基づいて RBM エージェント コードを作成できます。まず、次のコマンドを実行して、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 クライアント ライブラリが 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 Cloud コンソールの [Datastore エンティティ] ビューで Datastore を検査できます。
メッセージの配信ステータスを更新する
エージェントが送信されたメッセージ リクエストを Datastore に保存するようになりました。メッセージがユーザーのデバイスに正常に配信されたら、配信ステータスを更新します。
ユーザーデバイスが DELIVERED、READ、IS_TYPING のイベントを RBM エージェントに送信する
Cloud Pub/Sub に
エクスポートできますPub/Sub のハンドラで、配信されたイベントを確認する
配信済みフラグの Datastore 設定を 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
}
}
エージェントは送信メッセージを Datastore に保存し、 配信通知を受け取ります。次のセクションでは、Google App Engine で cron ジョブを設定して、10 分ごとに実行し、未配信メッセージをモニタリングする方法について説明します。
Google の App Engine での cron
cron ジョブを使用すると、さまざまな間隔でタスクをスケジュールできます。Google App Engine では、cron ジョブは説明、URL、間隔で構成されます。
Node.js アプリでは、これらを cron.yaml ファイルで構成します。このファイルをデプロイできます。
Google Cloud SDK を使用して App Engine にデプロイします。
その他の言語構成の設定については、
cron.yaml.
cron タスクには URL が必要であるため、Express.com に URL エンドポイントを追加する必要があります。 cron によって呼び出されるアプリルーター。この Webhook は、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 ジョブの Webhook に、
delivered 状態が false のすべての送信済みメッセージを検索するロジック
かつ、事前定義されたタイムアウトよりも 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 > Indexes] に表示されます。
インデックスを定義したら、cron 用に作成した Webhook に戻ることができます。 メッセージ有効期限ロジックを完了します。
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 を使用してストレージを管理します。 取消しのプロセスだけでなく、サービス アカウントを追跡する 正常に動作するはずです
ぜひお試しください。