RBM-Agent-Entwicklung mit einem Pull-Abo beschleunigen

RBM-Agents erhalten Nachrichten und Ereignisse über eine Veröffentlichung/Abo-Beziehung mit Google Cloud Pub/Sub. Wenn ein Nutzer auf die Nachrichten Ihres Agents antwortet, veröffentlicht die RBM-Plattform diese Nachrichten in einem eindeutigen Pub/Sub-Thema, auf das nur Ihr Agent Zugriff hat. Der Agent greift über ein Abo für dessen eindeutiges Thema auf diese Nachrichten und Ereignisse zu.

Pub/Sub unterstützt zwei Arten von Abos: Push und Pull. Mit einem Push-Abo sendet Cloud Pub/Sub Nachrichten an eine von Ihnen konfigurierte Webhook-URL. Bei einem Pull-Abo sind Sie dafür verantwortlich, Code zu schreiben, um einen Nachrichten-Listener mit langer Ausführungszeit zu erstellen und Nachrichten zu empfangen, wenn Sie sie empfangen.

Bei den meisten Entwicklern ist das Push-Abo der bekannteste und beliebteste Ansatz. Wenn Sie APIs von Drittanbietern verwendet haben, haben Sie wahrscheinlich auch Callback-/Webhook-URLs verwendet. Dieser Ansatz ist zwar einfach, erfordert aber, dass Entwickler jedes Mal, wenn sie eine Änderung testen möchten, auf öffentlichen Webservern bereitgestellt werden.

In diesem Artikel erfahren Sie, wie Sie ein Pull-Abo für lokale Tests einrichten und dieses Abo in einer Produktionsumgebung mit der App Engine von Google Cloud verwenden.

Pub/Sub für ein Pull-Abo konfigurieren

Wenn Sie Pub/Sub noch nicht für Ihren Agent konfiguriert haben, folgen Sie der Anleitung unter Cloud Pub/Sub, um Ihr erstes Abo zu erstellen.

Nachdem Sie Ihr Abo erstellt haben, ist es einfach, von einem Push- zu einem Pull-Modell zu wechseln. Rufen Sie die Google Cloud Console und dann den Abschnitt Pub/Sub > Abos auf. Klicken Sie auf das Dreipunkt-Menü neben dem Abo, das Sie für den Agent erstellt haben, und wählen Sie Bearbeiten aus. Sie sollten einen Konfigurationsbildschirm sehen, der dem unten gezeigten Bild ähnelt.

Abodetails

Legen Sie Zustellungstyp auf Pull fest und klicken Sie auf Speichern.

Asynchronen Pull-Abo-Handler einrichten

Als Nächstes müssen Sie Ihren RBM-Agent aktualisieren, um Nachrichten aus dem Abo abzurufen. Weitere Informationen dazu, wie Sie dies mithilfe verschiedener Programmiersprachen erreichen, finden Sie unter Asynchroner Abruf. Einige RBM-Agent-Beispiele, von denen viele ein Pull-Modell verwenden, finden Sie auch hier.

Der folgende Code zeigt, wie ein asynchroner Pull-Abo-Listener in Node.js eingerichtet wird:

function initPubsub() {
    let pubsub = new PubSub({
        projectId: REPLACE_WITH_GCP_PROJECT_ID,
        keyFilename: REPLACE_WITH_SERVICE_ACCOUNT_KEY_FILE_LOCATION,
    });

    // references an existing subscription, (e.g. rbm-agent-sub)
    let subscription = pubsub.subscription(PUB_SUB_SUBSCRIPTION_NAME);

    // create an event handler to handle messages
    let messageHandler = (message) => {
        console.log(`Received message ${message.id}:`);
        console.log(`\tData: ${message.data}`);
        console.log(`\tAttributes: ${message.attributes}`);

        let userEvent = JSON.parse(message.data);

        // TODO: process the userEvent to create another RBM message
        // "Ack" (acknowledge receipt of) the message
        message.ack();
    };

    // Listen for new messages
    subscription.on('message', messageHandler);

    return { messageHandler: messageHandler, subscription: subscription };
}

Wenn Sie Agents lokal testen möchten, müssen Sie nur initPubsub aufrufen, wenn Ihre Express-App gestartet wird. Dadurch werden die messageHandler-Antworten in Ihrer Konsole angezeigt.

In der App Engine von Google bereitstellen und bereitstellen

In einer Produktionsumgebung muss das Abo immer verfügbar sein. Ein einfacher Ansatz besteht darin, einen Cronjob zu verwenden, um den Pub/Sub-Nachrichten-Listener regelmäßig neu zu initialisieren.

Mit Cronjobs können Sie in App Engine Aufgaben in unterschiedlichen Intervallen planen. Ein Cronjob ist mit einer Beschreibung, einer URL und einem Intervall konfiguriert. In Node.js-Apps konfigurieren Sie diese in einer cron.yaml-Datei, die Sie mit dem Google Cloud SDK in App Engine bereitstellen können. Informationen zur Einrichtung anderer Sprachkonfigurationen finden Sie unter Jobs mit cron.yaml planen.

Da für die Cron-Aufgabe eine URL erforderlich ist, müssen Sie dem Express-App-Router einen URL-Endpunkt hinzufügen, der von Cron aufgerufen werden soll. Dadurch wird wiederum die Methode initPubsub aus dem vorherigen Abschnitt aufgerufen, um den Listener zu starten.

router.get('/pubsubCallback', function(req, res, next) {
  let pubsubConfig = initPubsub();

      // Stop listening once the timeout is hit
      setTimeout(() => {
        pubsubConfig.subscription.removeListener('message', pubsubConfig.messageHandler);
      }, CRON_JOB_TIMEOUT * 1000);

  res.status(200).send();
});

Außerdem müssen Sie den Listener entfernen, bevor die geplante Aufgabe noch einmal ausgeführt wird. Wenn der Cronjob beispielsweise jede Minute ausgeführt wird, konfigurieren Sie den Parameter CRON_JOB_TIMEOUT auf 60.

Unten finden Sie die Konfiguration der Datei cron.yaml, die diesen Endpunkt jede Minute ausführt.

cron:
- description: "Processing Pub/Sub messages"
  url: /pubsubCallback
  schedule: every 1 mins

Führen Sie den folgenden Befehl aus, um die Cron-Aufgaben in App Engine bereitzustellen:

gcloud app deploy cron.yaml

Nach der Bereitstellung konfiguriert die App Engine automatisch die Cron-Aufgabe und die Aufgabe kann wie unten beschrieben unter App Engine > Cronjobs angezeigt werden.

Konfigurierter Cronjob konfiguriert

Zusammenfassung und Zusammenfassung

Mit einem Pull-Abo können Sie lokal testen und Fehler beheben, was die Entwicklungszyklen beschleunigt und die Erstellung von RBM-Agents verkürzt. Obwohl das Pull-Modell im Vergleich zum Push-Modell zusätzliche Konfiguration und Code erfordert, ist die Einrichtung einfach und muss nur einmal konfiguriert werden. Cronjobs bieten eine einfache Möglichkeit, dafür zu sorgen, dass Ihr Pull-Abo immer für den Nachrichtenfluss Ihres Agents verfügbar ist, und mit App Engine sind Einrichtung und Wartung sehr kostengünstig.

Viel Erfolg und viel Spaß beim Programmieren!