Głównym czynnikiem wpływającym na czas dostarczenia wiadomości agenta jest to, czy użytkownik, z którym chcesz się skontaktować, ma połączenie z internetem w momencie wysyłania wiadomości przez agenta. Jeśli użytkownik jest offline, platforma RBM przechowuje wiadomość i próbuje ją wysłać przez maksymalnie 30 dni. Jeśli do tego czasu nie uda się dostarczyć wiadomości, zostanie ona usunięta z systemu.
Jest wiele powodów i sytuacji, w których użytkownik może nie mieć połączenia gdy agent próbuje się z nim skontaktować. Mogli wyłączyć transmisję danych mogą zaoszczędzić na abonamentach komórkowych, mogą wsiąść do samolotu bez Wi-Fi lub jedziesz metrem w tunelu. W zależności od pilności który ma dotrzeć do klienta, agent musi użytkowników offline przez unieważnienie niedostarczonych wiadomości RBM i ponowne przekierowanie tych wiadomości za pomocą innego kanału.
W następnych sekcjach znajdziesz szczegółowe informacje o tym, jak używać Google Cloud Datastore do śledzenia wysyłanych i dostarczanych wiadomości, jak używać zadania cron do odwoływania wiadomości, które nie zostały dostarczone, oraz jak przekierowywać te wiadomości za pomocą SMS-ów.
Śledzenie wysłanych wiadomości
Każda wiadomość wysyłana przez agenta RBM musi zawierać unikalny identyfikator wiadomości. Aby śledzić wiadomości wysyłane przez pracownika obsługi klienta, musisz zapisać identyfikator wiadomości, numer telefonu i sygnaturę czasową każdej wiadomości.
Możesz przechowywać te informacje przy użyciu różnych technologii, w tym: w Google Cloud Datastore. Cloud Datastore to wysoce skalowalna baza danych NoSQL, która automatycznie obsługuje podział na fragmenty i replikację. To świetnie rozwiązanie do przechowywania niepowiązanych danych, takich jak wiadomości wysyłane przez agenta. Cloud Datastore zależy od tego, czy masz aktywną Google App Engine, dzięki czemu możesz użyj App Engine do hostowania agenta RBM i skonfigurowania zadania cron.
Biblioteki klienta Cloud Datastore są dostępne w wielu językach. Dla: W tym przykładzie możesz użyć środowiska Node.js i oprzeć kod agenta RBM na Przykładowy Node.js pierwszy agenta dostępne na stronie RBM Developer. Na początku zainstaluj Cloud Datastore dla mojego projektu Node.js, uruchamiając to polecenie:
npm install --save @google-cloud/datastore
W kodzie źródłowym agenta dodaj odwołanie globalne do klienta Cloud Datastore bibliotece.
// Imports the Google Cloud client library
const Datastore = require('@google-cloud/datastore');
// Creates a client
const datastore = new Datastore({
projectId: PROJECT_ID,
});
Po utworzeniu obiektu datastore możesz wprowadzić funkcję do przechowywania
Stany msisdn, message id, sent time i delivery dla każdej wiadomości.
/**
* 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);
});
}
Gdy ta funkcja jest dostępna, musisz ją wywoływać za każdym razem, gdy agent
wysyła wiadomość do użytkownika. Gdy biblioteka klienta RBM w Node.js wysyła wiadomości RBM, w metodzie wywołania biblioteka przekazuje obiekt odpowiedzi, który zawiera messageId wiadomości wysłanej do użytkownika.
Oto przykład wysłania do użytkownika zwykłej wiadomości tekstowej i nagrania informacje o komunikacie po udanej komunikacji z interfejsem 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);
});
Po uruchomieniu kodu możesz sprawdzić Datastore w interfejsie Google Cloud Platform API Cloud Console w Encje magazynu danych widok.
Aktualizowanie stanu dostarczania wiadomości
Gdy agent przechowuje wysłane żądania wiadomości w Datastore, zaktualizuj atrybut stan dostarczenia po dostarczeniu wiadomości na urządzenie użytkownika.
Lista użytkowników urządzenia wysyłają zdarzenia DELIVERED, READ i IS_TYPING do agentów RBM
nad Cloud Pub/Sub. W module obsługi Pub/Sub sprawdź dostarczonych zdarzeń.
i zaktualizuj ustawienie Datastore dla flagi dostarczonej na „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
}
}
Agent zapisuje wychodzące wiadomości w Datastore i aktualizuje dane, gdy otrzyma powiadomienie o dostawie. W następnej sekcji dowiesz się, jak skonfigurować zadanie cron w usłudze App Engine Google, aby było wykonywane co 10 minut i monitorowało niewysłane wiadomości.
Cron w Google App Engine
Za pomocą zadań cron możesz planować zadania w różnych odstępach czasu. W App Engine Google zadanie cron jest konfigurowane za pomocą opisu, adresu URL i interwału.
W aplikacjach Node.js konfigurujesz je w pliku cron.yaml, który możesz wdrożyć
do App Engine przy użyciu pakietu SDK Google Cloud.
Informacje o innych konfiguracjach językowych znajdziesz w sekcji Planowanie zadań z
cron.yaml.
Ponieważ zadanie cron wymaga adresu URL, musisz dodać do raportu punkt końcowy adresu URL routera aplikacji, który ma być wywoływany przez cron. Ten webhook odpowiada za wysyłanie zapytań Datastore dla starych wiadomości, usuwania ich z platformy RBM i wysyłania wysłać je użytkownikowi w wiadomości 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();
});
Poniżej znajduje się konfiguracja pliku cron.yaml, która umożliwia wykonywanie tego punktu końcowego co 10 minut.
cron:
- description: "Processing expired RBM messages"
url: /expireMessages
schedule: every 10 mins
Aby wdrożyć zadania cron w App Engine, uruchom to polecenie:
gcloud app deploy cron.yaml
Po wdrożeniu App Engine automatycznie skonfiguruje zadanie cron, które będzie widoczne w sekcji App Engine > Zadania cron.
Wysyłanie zapytania do Datastore o niedostarczone wiadomości
W webhooku zadania cron skonfigurowanego w poprzedniej sekcji musisz dodać
do wyszukiwania wszystkich wysłanych wiadomości o stanie delivered równym false (fałsz)
i są starsze o lastUpdated czasu niż wstępnie zdefiniowany czas oczekiwania, który
sensowne w danym przypadku. W tym przykładzie są to wiadomości starsze niż godzinę.
Aby obsługiwać takie zapytanie złożone, Datastore musi mieć złożony indeks zawierający zarówno właściwości delivered, jak i lastUpdated. Aby to zrobić, utwórz w projekcie plik o nazwie index.yaml z tymi informacjami:
indexes:
- kind: Message
properties:
- name: delivered
direction: asc
- name: lastUpdated
direction: desc
Podobnie jak w przypadku wdrażania zdefiniowanego wcześniej zadania cron, użyj pakietu Google Cloud SDK, aby za pomocą tego polecenia wdrożyć zdefiniowany przez siebie indeks złożony:
gcloud datastore create-indexes index.yaml
Po wdrożeniu App Engine automatycznie skonfiguruje indeks, a indeks znajduje się w sekcji Datastore > Indeksy.
Po zdefiniowaniu indeksu możesz wrócić do webhooka utworzonego na potrzeby narzędzia cron i dokończyć proces wygaśnięcia wiadomości:
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 natywnie nie obsługuje zastępczych SMS-ów, więc konieczne będzie zaimplementowanie wysyłania niedostarczonych wiadomości SMS-em.
Podsumowanie i zakończenie
Aby obsługiwać użytkowników offline, możesz utworzyć logikę cofnięcia w przypadku niewysłanych wiadomości RBM. Czas, w którym wiadomość jest aktywna, zależy od tego, jak ważne są przesyłane informacje. W przypadku informacji o charakterze pilnym zalecany czas oczekiwania to mniej niż 2 godziny.
W tym przykładzie do zarządzania miejscem na dane wykorzystano Cloud Datastore i Google App Engine. i unieważniania, ale też dowolny mechanizm przechowywania Wysłane i dostarczone wiadomości powinny działać.
Powodzenia i miłej zabawy z programowaniem