Ausfallsicherung für mehrere Benutzer und mehrere Kanäle mit Dispatch API
Dieses Tutorial zeigt Ihnen, wie Sie eine Nachricht an eine Liste von Benutzern mit automatischem Failover senden können.
Die Idee ist, dass Sie eine Liste von Benutzern haben, und jeder Benutzer hat zwei oder mehr zugewiesene Kanäle, von denen der letzte der endgültige Rückfallkanal ist. Es wird versucht, die Nachricht an den ersten Benutzer in der Prioritätsliste der Benutzer auf den ihnen zugewiesenen Kanälen zu senden. Jeder Kanal wird der Reihe nach abgearbeitet, wobei eine geeignete Failover-Bedingung gilt.
Wenn alle Versuche, die Nachricht von einem Benutzer lesen zu lassen, fehlschlagen, wird die Bearbeitung an den nächsten Benutzer in der Prioritätsliste weitergegeben.
Nehmen wir an, Ihr Hauptserver hat eine Störung und Sie möchten eine Liste von Systemadministratoren benachrichtigen, die auf Abruf bereitstehen. Jeder Administrator hat möglicherweise mehrere Kanäle, über die er kontaktiert werden kann. Die Liste der Benutzer würde so lange abgearbeitet, bis mindestens einer der Administratoren die wichtige Nachricht gelesen hat.
Beispielszenario
Der beste Weg, diesen Anwendungsfall zu verstehen, ist ein Blick auf die Beispielkonfigurationsdatei, sample.json:
{
"APP": {
"APP_ID": "abcd1234-8238-42d0-a03a-abcd1234...",
"PRIVATE_KEY": "private.key"
},
"FROM": {
"MESSENGER": "COMPANY MESSENGER ID",
"VIBER": "COMPANY VIBER ID",
"WHATSAPP": "COMPANY WHATSAPP NUMBER",
"SMS": "COMPANY SMS NAME/NUMBER"
},
"USERS": [
{
"name": "Tony",
"channels": [
{
"type": "messenger",
"id_num": "USER MESSENGER ID"
},
{
"type": "sms",
"id_num": "USER PHONE NUMBER"
}
]
},
{
"name": "Michael",
"channels": [
{
"type": "viber_service_msg",
"id_num": "USER PHONE NUMBER"
},
{
"type": "whatsapp",
"id_num": "USER PHONE NUMBER"
},
{
"type": "sms",
"id_num": "USER PHONE NUMBER"
}
]
}
]
}
Der wichtigste Teil dieser Konfigurationsdateien ist die USERS Abschnitt. Hier haben Sie eine Prioritätenliste von Benutzern. In diesem Fall wird die Anwendung versuchen, die Nachricht an Tony zu senden, und wenn Tony die Nachricht nicht innerhalb der Ablaufzeit auf einem der vorgesehenen Kanäle liest, wird der Vorgang für Michael wiederholt.
HINWEIS: Die Failover-Bedingung für jeden Kanal von read mit einer Verfallszeit von 600 ist derzeit in der Applikation fest einkodiert, kann aber in der Konfigurationsdatei hinzugefügt werden (siehe Fall-3 für den Code, wie man das macht).
Beachten Sie, dass die folgenden Bedingungen gelten:
- Der Benutzer muss über mindestens zwei Kanäle verfügen.
- Der Benutzer kann eine beliebige Anzahl von Kanälen und Typen mischen, solange es mindestens zwei Kanäle gibt. Zum Beispiel könnte ein Benutzer 3 SMS-Nummern plus eine Messenger-ID haben.
- Der letzte für einen Benutzer angegebene Kanal wird als letzter Ausweichkanal betrachtet. Er wird etwas anders gehandhabt, da er im Workflow-Modell nicht mit einer Failover-Bedingung verknüpft ist. Schlägt dies fehl, wird der nächste Benutzer in der Liste verarbeitet.
- Der letzte Ausweichkanal muss nicht zwangsläufig SMS sein, obwohl dies in der Regel der Fall sein wird.
- Ein Workflow wird für jeden Benutzer erstellt, aber Sie können für jeden Benutzer einen eigenen Workflow festlegen.
- Es wird versucht, auf jeden Benutzer einen Arbeitsablauf in der Reihenfolge anzuwenden, in der die Benutzer in der Konfigurationsdatei aufgeführt sind.
- Das Failover von einem Kanal zum nächsten erfolgt automatisch und wird von der Dispatch API transparent gehandhabt.
Quellcode
Der Python-Quellcode für dieses Projekt ist in der Community verfügbar GitHub-Repository. In der Codebasis sind eigentlich drei Anwendungsfälle enthalten, aber dieses Tutorial beschreibt nur case-2. Der Code für case-2 speziell gefunden werden können hier. Es gibt zwei Dateien - die Beispielkonfigurationsdatei, sample.json und die Anwendung, app.py.
Voraussetzungen
- Vonage-Account erstellen
- Node JS installieren - die für die Verwendung der Vonage-Befehlszeilenschnittstelle (CLI) erforderlich sind.
- Installieren Sie die Vonage CLI
- Wissen, wie Sie Ihren Webhook-Server lokal testen können
- Python 3 installiert
- Kolben installiert
- Besitzen Sie Accounts für die Kanäle, die Sie unterstützen möchten, wie Facebook, Viber und WhatsApp.
Es kann auch nützlich sein, die folgenden Übersichtsthemen zu lesen:
Wenn Sie planen, diesen Anwendungsfall mit Facebook Messenger zu testen, wird empfohlen, dass Sie die folgenden Schritte durchführen diese Anleitung Erstens.
Die Schritte
Nachdem die Voraussetzungen erfüllt sind, gehen Sie wie folgt vor:
- Erstellen einer Vonage-Applikation
- Ngrok zum Laufen bringen
- Starten Sie Ihren Webhook-Server
- Überprüfen Sie den Anwendungscode
- Testen Sie die App
Es gibt verschiedene Möglichkeiten, das gleiche Ergebnis mit Vonage zu erzielen. In diesem Tutorial wird nur ein bestimmter Weg gezeigt, z. B. wie Sie die Anwendung über die Befehlszeile und nicht über das Dashboard erstellen. In anderen Tutorials werden andere Vorgehensweisen gezeigt.
Erstellen Sie Ihre Vonage Applikation
Falls Sie dies noch nicht getan haben, erstellen Sie ein neues Verzeichnis für Ihr Projekt, z. B. multi-user-dispatch. Wechseln Sie in dieses Verzeichnis.
Verwenden Sie die CLI, um Ihre Vonage-Anwendung zu erstellen:
Notieren Sie sich die generierte Application ID. Sie können dies auch in der Dashboard.
Mit diesem Befehl wird auch ein privater Schlüssel erstellt, multi_user_dispatch_app.key in Ihrem aktuellen Verzeichnis, sowie die Aktualisierung/Erstellung von vonage_app.json.
Mit diesem Befehl werden auch die beiden Webhooks festgelegt, über die die gesamte Interaktion zwischen Ihrer Anwendung und Vonage erfolgt. Sie müssen über einen Server verfügen, der für Vonage unter diesen URLs erreichbar ist
Ngrok zum Laufen bringen
Stellen Sie sicher, dass Sie Ngrok zum Testen lokal laufen lassen. Um Ngrok zu starten, geben Sie ein:
Um eine temporäre Ngrok-URL zu erzeugen. Wenn Sie ein bezahlter Abonnent sind, können Sie eingeben:
HINWEIS: In diesem Fall leitet Ngrok die Vonage-Webhooks, die Sie bei der Erstellung Ihrer Vonage-Anwendung angegeben haben, an localhost:9000.
Starten Sie Ihren Webhook-Server
Sie müssen Ihren Webhook-Server zum Laufen bringen, damit Webhooks bestätigt werden und Details zu gesendeten Nachrichten protokolliert werden können. Ihr Webhook-Server sieht in etwa so aus wie der folgende:
from flask import Flask, request, jsonify
from pprint import pprint
app = Flask(__name__)
@app.route('/webhooks/inbound', methods=['POST'])
def inbound_message():
print ("** inbound_message **")
data = request.get_json()
pprint(data)
return ("inbound_message", 200)
@app.route('/webhooks/status', methods=['POST'])
def message_status():
print ("** message_status **")
data = request.get_json()
pprint(data)
return ("message_status", 200)
if __name__ == '__main__':
app.run(host="localhost", port=9000)
Fügen Sie diesen Code in eine Datei namens server.py und speichern Sie es.
Führen Sie es lokal mit aus:
Überprüfen Sie den Anwendungscode
Der Einfachheit halber ist der Code in einer einzigen Datei enthalten app.py. Es gibt nur diese und Ihre JSON-Konfigurationsdatei, config.json, die zunächst durch Kopieren von sample.json.
Am wichtigsten ist, dass die Konfigurationsdatei die Liste der zu kontaktierenden Benutzer in der Reihenfolge ihrer Priorität sowie die ihnen zugewiesenen Kanäle speichert. Jeder Benutzer muss in dieser Implementierung mindestens zwei Kanäle haben, aber es kann eine beliebige Mischung von Kanälen pro Benutzer geben. Ein Benutzer könnte beispielsweise drei SMS-Nummern haben, ein anderer Benutzer eine Messenger-ID, Viber und zwei weitere SMS-Nummern.
Der letzte Kanal, der für jeden Benutzer aufgelistet ist, wird als letzter Rückfall behandelt, bevor zu einem anderen Benutzer gewechselt wird. Für jeden Benutzer wird für jeden Kanal eine Nachricht über die Dispatch API gesendet, mit automatisch Failover zum nächsten Kanal, wenn die Nachricht nicht innerhalb von 600 Sekunden gelesen wird.
Der erste Teil des Anwendungscodes, app.pyliest die Konfigurationsdatei und lädt die wichtigen Variablen und Datenstrukturen. Es wird davon ausgegangen, dass Ihr Unternehmen alle vier von der Dispatch API unterstützten Kanäle unterstützen wird, messenger, viber_service_msg, whatsapp und smsobwohl den Zielnutzern nur ihre bevorzugten Kanäle zugewiesen werden können. Einige Nutzer können zum Beispiel nur per SMS kontaktiert werden.
Es gibt eine Hilfsfunktion, set_field_typesum der Tatsache Rechnung zu tragen, dass einige Kanäle numbers und einige verwenden idsund Viber, das beides verwendet ids und numbers.
Die Hauptfunktionalität für diesen Anwendungsfall liegt in der build_user_workflow Funktion. Mit diesem Code wird ein Arbeitsablauf wie der folgende erstellt:
{
"template": "failover",
"workflow": [
{
"from": {
"type": "messenger",
"id": "from_messenger"
},
"to": {
"type": "messenger",
"id": "user_id_num"
},
"message": {
"content": {
"type": "text",
"text": "This is a Facebook Messenger message sent using the Dispatch API"
}
},
"failover": {
"expiry_time": "600",
"condition_status": "read"
}
},
{
"from": {
"type": "viber_service_msg",
"id": "from_viber"
},
"to": {
"type": "viber_service_msg",
"number": "user_id_num"
},
"message": {
"content": {
"type": "text",
"text": "This is a Viber Service Message sent using the Dispatch API"
}
},
"failover": {
"expiry_time": "600",
"condition_status": "read"
}
},
{
"from": {
"type": "sms",
"number": "from_sms"
},
"to": {
"type": "sms",
"number": "user_id_num"
},
"message": {
"content": {
"type": "text",
"text": "This is an SMS sent using the Dispatch API"
}
}
}
]
}
Die Funktion build_user_workflow stellt außerdem sicher, dass die aus der Konfigurationsdatei gelesenen Werte in den Arbeitsablauf eingebettet werden.
Sie haben wahrscheinlich bemerkt, dass die expiry_time und condition_status sind in den Arbeitsablauf fest einkodiert als integrierte build_user_workflow. Dies wurde getan, um den Code so einfach wie möglich zu halten, aber Sie könnten diese Parameter in die Konfigurationsdatei auf der Basis einzelner Kanäle hinzufügen. In diesem Fall könnten einige Benutzer eine 300-Sekunden-Frist für einige Kanäle haben, und Sie könnten auch die Failover-Bedingung von read oder delivered auf der Basis eines jeden Kanals. Dies wurde für Sie implementiert in Fall-3 wird aber in diesem Tutorial nicht weiter beschrieben, da der gesamte Code zusammen mit der geänderten Beispielkonfigurationsdatei vorhanden ist.
Sobald der Workflow erstellt wurde, verwenden Sie die Dispatch API um die Nachricht zu senden:
r = requests.post('https://api.nexmo.com/v0.1/dispatch', headers=headers, data=workflow)
Für die Authentifizierung des API-Aufrufs wird ein JWT generiert. Aus diesem Grund müssen Sie die app_id und private_key Werte, als Sie Ihre Vonage-Anwendung erstellt haben. Diese müssen in Ihre Konfigurationsdatei aufgenommen werden.
Testen Sie die App
Kopieren sample.json zu config.json.
Stellen Sie sicher, dass Sie die entsprechenden Werte in config.json für Parameter wie app_id, private_key und die Details für Ihre verschiedenen unterstützten Kanäle. Vergewissern Sie sich, dass Sie Ihre Benutzerliste so konfiguriert haben, wie Sie die Dinge testen wollen.
TIPP: Es lohnt sich, die geänderte Konfigurationsdatei an dieser Stelle mit einer JSON-Linter.
Sie können die App dann mit ausführen:
Die Anwendung verarbeitet die Konfigurationsdatei und kontaktiert nacheinander jeden Benutzer, bis die Nachricht gelesen wurde.
SMS
Sie können jedes Mobiltelefon, das SMS empfangen kann, zum Testen dieses Tutorials verwenden.
Facebook Messenger
Um mit Facebook Messenger zu testen, sind ein paar zusätzliche Schritte erforderlich. Diese wurden im Detail besprochen in diese AnleitungDaher wurden diese Informationen hier nicht wiedergegeben.
Viber
Du brauchst eine Viber Service Message ID, um dieses Tutorial mit Viber zu testen.
Sie benötigen einen WhatsApp Business Account, um dieses Tutorial mit WhatsApp zu testen. Außerdem muss dem Zielnutzer ein MTM geschickt werden, bevor er Nachrichten von Ihrem Unternehmen empfangen kann.
Zusammenfassung
In diesem Lernprogramm haben Sie einen Anwendungsfall gesehen, bei dem Sie versuchen können, eine Nachricht an eine Liste von Benutzern zu senden, wobei jeder Benutzer mehrere Kanäle hat. Die Anwendung bricht ab, wenn die Nachricht gelesen worden ist.