Pub/Sub-Nachrichten schreiben und beantworten

Regions-ID

REGION_ID ist ein abgekürzter Code, den Google anhand der Region zuweist, die Sie beim Erstellen Ihrer Anwendung ausgewählt haben. Der Code bezieht sich nicht auf ein Land oder eine Provinz, auch wenn einige Regions-IDs häufig verwendeten Länder- und Provinzcodes ähneln können. Das Einbinden von REGION_ID.r in App Engine-URLs ist für vorhandene Anwendungen optional und wird bald für alle neuen Anwendungen erforderlich sein.

Für einen reibungslosen Übergang wird App Engine nach und nach für die Verwendung von Regions-IDs aktualisiert. Wenn Ihr Google Cloud-Projekt noch nicht aktualisiert wurde, wird für Ihre Anwendung keine Regions-ID angezeigt. Da die ID für vorhandene Anwendungen optional ist, müssen Sie keine URLs aktualisieren oder andere Änderungen vornehmen, wenn die Regions-ID für Ihre vorhandenen Anwendungen verfügbar wird.

Hier finden Sie weitere Informationen zu Regions-IDs.

Pub/Sub bietet zuverlässiges und asynchrones m:n-Messaging zwischen Anwendungen. Publisher-Anwendungen können Nachrichten an ein bestimmtes Thema senden. Andere Anwendungen haben die Möglichkeit, dieses Thema zu abonnieren, um Nachrichten dazu zu erhalten.

In diesem Dokument wird beschrieben, wie Sie mit der Cloud-Clientbibliothek Pub/Sub-Nachrichten in einer Node.js-Anwendung senden und empfangen.

Vorbereitung

  • Folgen Sie der Anleitung unter "Hello, World!" für Node.js in App Engine, um Ihre Umgebung und Ihr Projekt einzurichten und um mehr über die Strukturierung von Node.js-Anwendungen in App Engine zu erfahren.
  • Notieren Sie sich Ihre Projekt-ID und bewahren Sie sie auf. Sie benötigen die ID zur Ausführung der in diesem Dokument beschriebenen Beispielanwendung.

Beispielanwendung klonen

Kopieren Sie die Beispielanwendungen auf Ihren lokalen Computer und rufen Sie das Verzeichnis pubsub auf:

git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples
cd nodejs-docs-samples/appengine/pubsub

Thema und Abo erstellen

Erstellen Sie ein Thema und ein Abo, einschließlich des Endpunkts, an den der Pub/Sub-Server Anfragen senden soll:

gcloud pubsub topics create YOUR_TOPIC_NAME
gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
    --topic YOUR_TOPIC_NAME \
    --push-endpoint \
    https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/pubsub/push?token=YOUR_TOKEN \
    --ack-deadline 10

Ersetzen Sie YOUR_TOKEN durch ein geheimes, zufälliges Token. Der Push-Endpunkt verwendet dieses zum Verifizieren von Anfragen.

Umgebungsvariablen festlegen

Bearbeiten Sie app.flexible.yaml, um die Umgebungsvariablen für Ihre Projekt-ID, das Thema und das Verifizierungstoken festzulegen:

env_variables:
  PUBSUB_TOPIC: YOUR_TOPIC_NAME
  # This token is used to verify that requests originate from your
  # application. It can be any sufficiently random string.
  PUBSUB_VERIFICATION_TOKEN: YOUR_VERIFICATION_TOKEN

Codeüberprüfung

Die Beispielanwendung verwendet die Cloud-Clientbibliotheken.

Die Beispielanwendung verwendet die in der Datei app.flexible.yaml festgelegten Werte zum Konfigurieren von Umgebungsvariablen. Auf der Grundlage dieser Werte bestätigt der Push-Anfrage-Handler, dass die Anfrage von Pub/Sub kommt und aus einer vertrauenswürdigen Quelle stammt:

// The following environment variables are set by app.flexible.yaml when
// running on App Engine, but will need to be manually set when running locally.
var PUBSUB_VERIFICATION_TOKEN = process.env.PUBSUB_VERIFICATION_TOKEN;
var pubsub = gcloud.pubsub({
    projectId: process.env.GOOGLE_CLOUD_PROJECT
});
var topic = pubsub.topic(process.env.PUBSUB_TOPIC);

Die Beispielanwendung verwaltet eine globale Liste zum Speichern der von dieser Instanz empfangenen Nachrichten:

// List of all messages received by this instance
var messages = [];

Diese Methode empfängt Push-Nachrichten und fügt sie der globalen Liste messages hinzu:

app.post('/pubsub/push', jsonBodyParser, (req, res) => {
  if (req.query.token !== PUBSUB_VERIFICATION_TOKEN) {
    res.status(400).send();
    return;
  }

  // The message is a unicode string encoded in base64.
  const message = Buffer.from(req.body.message.data, 'base64').toString(
    'utf-8'
  );

  messages.push(message);

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

Diese Methode interagiert mit der App Engine-Webanwendung, um neue Nachrichten zu veröffentlichen und empfangene Nachrichten anzuzeigen:

app.get('/', (req, res) => {
  res.render('index', {messages, tokens, claims});
});

app.post('/', formBodyParser, async (req, res, next) => {
  if (!req.body.payload) {
    res.status(400).send('Missing payload');
    return;
  }

  const data = Buffer.from(req.body.payload);
  try {
    const messageId = await topic.publish(data);
    res.status(200).send(`Message ${messageId} sent.`);
  } catch (error) {
    next(error);
  }
});

Beispiel lokal ausführen

Bei einer lokalen Ausführung können Sie sich über das Cloud SDK für die Nutzung von Google Cloud APIs authentifizieren. Wenn Sie Ihre Umgebung wie unter Vorbereitung beschrieben eingerichtet haben, ist die Authentifizierung bereits über den Befehl gcloud init erfolgt.

Legen Sie vor dem Starten Ihrer Anwendung Umgebungsvariablen fest:

export GOOGLE_CLOUD_PROJECT=[your-project-id]
export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
npm install
npm start

Push-Benachrichtigungen simulieren

Die Anwendung kann Nachrichten lokal senden, aber keine Push-Nachrichten lokal empfangen. Sie können jedoch eine Push-Nachricht simulieren, wenn Sie eine HTTP-Anfrage an den lokalen Push-Benachrichtigungsendpunkt senden. Das Beispiel enthält die Datei sample_message.json.

Sie verwenden curl oder einen httpie-Client, um eine HTTP-Anfrage vom Typ POST zu senden:

curl -H "Content-Type: application/json" -i --data @sample_message.json "localhost:8080/pubsub/push?token=[your-token]"

Oder

http POST ":8080/pubsub/push?token=[your-token]" < sample_message.json

Antwort

HTTP/1.1 200 OK
Connection: keep-alive
Date: Mon, 31 Aug 2015 22:19:50 GMT
Transfer-Encoding: chunked
X-Powered-By: Express

Nachdem die Anfrage abgeschlossen ist, können Sie localhost:8080 aktualisieren und die Nachricht in der Liste der empfangenen Nachrichten sehen.

In App Engine ausführen

Zum Bereitstellen der Demo-App in App Engine mithilfe des gcloud-Befehlszeilentools führen Sie den folgenden Befehl in dem Verzeichnis aus, in dem sich die app.flexible.yaml befindet:

gcloud app deploy app.flexible.yaml

Sie können jetzt unter https://PROJECT_ID.REGION_ID.r.appspot.com auf die Anwendung zugreifen. Sie können das Formular zum Senden von Nachrichten verwenden, dabei ist jedoch nicht sicher, welche Instanz Ihrer Anwendung die Benachrichtigung erhält. Außerdem haben Sie die Möglichkeit, mehrere Nachrichten zu senden und die Seite zu aktualisieren, damit die empfangene Nachricht angezeigt wird.