Java >> Java Tutorial >  >> Java

So verwenden Sie Pub/Sub mit NodeJS

In diesem Beitrag zeige ich, wie man Pub/Sub-Muster mit der NodeJS-Anwendung verwendet. Wir verwenden das Google Cloud Pub/Sub-Modul zum Erstellen dieser Beispielanwendung.

Was ist Pub/Sub?

Früher waren die meisten Architekturen synchron. Aber mit dem Aufkommen von Microservices ist die asynchrone Kommunikation ein gleichberechtigter Teil des Designs. Pub/Sub ist ein solches Modell, das asynchrone Kommunikation ermöglicht. Normalerweise veröffentlicht in einer ereignisgesteuerten Architektur ein Dienst ein Ereignis und ein anderer Dienst verarbeitet dieses Ereignis.

Ein Nachrichtenbroker spielt eine Relaisrolle, wenn es darum geht, die Nachrichten zu veröffentlichen und zu konsumieren. Sowohl Google Cloud (Pub-Sub) als auch AWS bieten einen Dienst (SNS &SQS) an, der es Anwendungen ermöglicht, das Pub-Sub-Modell zu verwenden. Ein weiterer Vorteil von Pub/Sub besteht darin, dass es die Einrichtung einer Wiederholungsrichtlinie ermöglicht und Idempotenz abdeckt. Hier erfahren Sie mehr über ereignisgesteuerte Architektur.

Gegentakt

In jedem Pub-Sub-Modell gibt es zwei Implementierungsmuster. Einer ist Push und der andere Pull.

Im Pull-Modell

  • Der Konsument sendet eine Anfrage zum Abrufen von Nachrichten.
  • Der Pub/Sub-Server antwortet mit einer Nachricht, wenn Nachrichten verfügbar sind und noch nicht verwendet wurden.
  • Der Konsument sendet eine Bestätigung.

Im Push-Modell

  • Der Publisher veröffentlicht eine Nachricht an den Pub/Sub-Server
  • Der Pub/Sub-Server sendet die Nachricht an den angegebenen Endpunkt auf der Verbraucherseite.
  • Sobald der Konsument die Nachrichten erhält, sendet er eine Bestätigung.

NodeJS-Anwendung

Als Teil des Beitrags werden wir eine nodejs-Anwendung erstellen, die das Pub-Sub-Modell verwendet. Diese Anwendung sendet einfache Nachrichten an Google Cloud Pub/Sub. Wir werden eine andere Verbraucheranwendung haben, die diese Nachricht verarbeitet.

Bevor wir also unsere Anwendung schreiben, stellen wir sicher, dass Sie den gcloud-Emulator in Ihrer Umgebung installiert haben. Installieren Sie zuerst gcloud sdk, je nachdem, welches Betriebssystem Sie haben.

Initialisieren Sie nun die gcloud in Ihrer Umgebung und Sie müssen sich dafür anmelden

gcloud init

Gcloud stellt eine Reihe von Fragen, um ein Projekt auszuwählen und eine Cloud-Umgebung zu konfigurieren.

Jetzt installieren wir einen pub-sub Komponentenemulator für gcloud in unserer lokalen Umgebung.

gcloud components install pubsub-emulator

Um nun mit dem Pub-Sub-Dienst zu beginnen, verwenden Sie den folgenden Befehl

gcloud beta emulators pubsub start --project=pubsubdemo --host-port=localhost:8085

Dieser Befehl startet den pubsub-Dienst auf Ihrem Computer unter localhost:8085. Da wir diesen Dienst in unserer Anwendung verwenden müssen, müssen wir wissen, wo sich der Dienst befindet. Setzen Sie also zwei Umgebungsvariablen

PUBSUB_EMULATOR_HOST=localhost:8085

PUBSUB_PROJECT_ID=pubsubdemo

Publisher-Anwendung

Im Allgemeinen haben wir eine Publisher-Anwendung. Diese Anwendung prüft, ob das Thema im Pub-Sub-Dienst vorhanden ist, und wenn nicht, erstellt sie dieses Thema. Nachdem das Thema erstellt wurde, sendet es die Daten über eine Nachricht an das Thema des Pub-Sub-Dienstes.

Der Code für diese Anwendung sieht wie folgt aus:


const { PubSub } = require('@google-cloud/pubsub');
require('dotenv').config();

const pubsubClient = new PubSub();

const data = JSON.stringify({
  "userId": "50001",
  "companyId": "acme",
  "companyName": "Acme Company",
  "firstName": "John",
  "lastName": "Doe",
  "email": "[email protected]",
  "country": "US",
  "city": "Austin",
  "status": "Active",
  "effectiveDate": "11/11/2021",
  "department": "sales",
  "title": "Sales Lead"
});
const topicName = "PubSubExample";

async function createTopic() {
  // Creates a new topic
  await pubsubClient.createTopic(topicName);
  console.log(`Topic ${topicName} created.`);
}

async function doesTopicExist() {
  const topics = await pubsubClient.getTopics();
  const topicExists = topics.find((topic) => topic.name === topicName);
  return (topics && topicExists);
}

if(!doesTopicExist()) {
  createTopic();
}

async function publishMessage() {
    const dataBuffer = Buffer.from(data);

    try {
      const messageId = await pubsubClient.topic(topicName).publish(dataBuffer);
      console.log(`Message ${messageId} published`);
    } catch(error) {
      console.error(`Received error while publishing: ${error.message}`);
      process.exitCode = 1;
    }
}

publishMessage();

Schauen wir uns umgekehrt die Verbraucheranwendung an.


require('dotenv').config();

const { PubSub } = require(`@google-cloud/pubsub`);

const pubsubClient = new PubSub();
const subscriptionName = 'consumeUserData';
const timeout = 60;
const topicName = 'PubSubExample';

async function createSubscription() {
  // Creates a new subscription
  await pubsubClient.topic(topicName).createSubscription(subscriptionName);
  console.log(`Subscription ${subscriptionName} created.`);
}

async function doesSubscriptionExist() {
  const subscriptions = await pubsubClient.getSubscriptions();
  const subscriptionExist = subscriptions.find((sub) => sub.name === subscriptionName);
  return (subscriptions && subscriptionExist);
}

if(!doesSubscriptionExist()) {
    createSubscription().catch(console.error);
}

const subscription = pubsubClient.subscription(subscriptionName);

let messageCount = 0;

const messageHandler = message => {
  console.log(`message received ${message.id}`);
  console.log(`Data: ${message.data}`);
  messageCount += 1;

  message.ack();
};

subscription.on(`message`, messageHandler);
setTimeout(() => {
  subscription.removeListener('message', messageHandler);
  console.log(`${messageCount} message(s) received`);
}, timeout * 1000);

Grundsätzlich überprüft diese Verbraucheranwendung, ob das Abonnement vorhanden ist. Wenn nicht, erstellt sie ein Abonnement für das Thema, an das unsere Herausgeberanwendung Nachrichten sendet. Sobald die Nachricht im Pub-Sub-Thema ankommt, ruft die Verbraucheranwendung diese Nachricht ab. Diese Anwendung implementiert das PULL-Modell von pub-sub.

Demo

Beim Starten des Pubsub-Dienstemulators sehen wir das folgende Protokoll:

Lassen Sie uns nun die Publisher-Anwendung ausführen und wir sehen ein Konsolenprotokoll der Nachrichtenveröffentlichung

Wenn Sie dieselbe Anwendung ausführen, wird die Meldung Topic PubSubExample created nicht angezeigt .

Wenn Sie jetzt die Verbraucheranwendung ausführen, ziehen wir die Nachricht, die der Herausgeber an das Thema gesendet hat.

Gleiche Demo mit einem einfachen Webstuhl-Video hier.

Schlussfolgerung

In diesem Beitrag habe ich gezeigt, wie man Pub Sub mit der NodeJS-Anwendung verwendet. Pub-Sub ist ein leistungsstarkes Modell zur Verwendung in Unternehmensanwendungen. Es ermöglicht uns, Dienste zu erstellen, die asynchron kommunizieren können. Wenn Sie weitere Fragen zu diesem Thema haben, können Sie sich gerne an mich wenden.


Java-Tag