Java >> Java tutorial >  >> Java

Sådan bruges Pub/Sub med NodeJS

I dette indlæg viser jeg, hvordan man bruger pub/sub-mønster med NodeJS-applikationen. Vi vil bruge Google Cloud Pub/Sub-modulet til at bygge denne eksempelapplikation.

Hvad er Pub/Sub?

De fleste arkitekturer plejede at være synkrone tidligere. Men med fremkomsten af ​​mikrotjenester er asynkron kommunikation en ligeværdig del af designet. Pub/Sub er en sådan model, der tillader asynkron kommunikation. Normalt i begivenhedsdrevet arkitektur udgiver en tjeneste en begivenhed, og en anden tjeneste bruger den begivenhed.

En meddelelsesmægler spiller en relærolle, når det kommer til at publicere og forbruge meddelelserne. Både Google Cloud(Pub-Sub) og AWS tilbyder en tjeneste (SNS &SQS), der tillader applikationer at bruge Pub-Sub-modellen. En anden fordel ved Pub/Sub er, at det giver mulighed for at oprette en genforsøgspolitik, der dækker idempotens. Du kan lære mere om begivenhedsdrevet arkitektur her.

Push-Pull

I enhver pub-sub-model er der to implementeringsmønstre. Den ene er Push og den anden er Pull.

I Pull Model

  • Forbrugeren sender en anmodning om at trække eventuelle beskeder.
  • Pub-/underserveren svarer med en besked, hvis der er nogen beskeder tilgængelige og ikke tidligere har været brugt.
  • Forbrugeren sender en bekræftelse.

I push-model

  • Udgiveren udgiver en besked til Pub/Sub Server
  • Pub/Sub-serveren sender beskeden til det angivne slutpunkt på forbrugersiden.
  • Når forbrugeren modtager beskederne, sender den en bekræftelse.

NodeJS-applikation

Som en del af indlægget vil vi oprette en nodejs-applikation, der bruger pub-sub-modellen. Denne applikation sender enkle beskeder til Google Cloud pub/sub. Vi vil have en anden forbrugerapplikation, der bruger denne besked.

Derfor, før vi skriver vores ansøgning, lad os sørge for, at du har installeret gcloud-emulator på dit miljø. Først skal du installere gcloud sdk afhængigt af hvilket operativsystem du har.

Initialiser nu gcloud på dit miljø, og du bliver nødt til at logge ind for dette

gcloud init

Gcloud vil stille en masse spørgsmål for at vælge et projekt og konfigurere et skymiljø.

Nu vil vi installere en pub-sub komponentemulator til gcloud på vores lokale miljø.

gcloud components install pubsub-emulator

Nu for at komme i gang med pub-sub service, brug følgende kommando

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

Denne kommando vil starte pubsub-tjenesten på din maskine på localhost:8085. Da vi bliver nødt til at bruge denne tjeneste i vores applikation, bliver vi nødt til at vide, hvor tjenesten er placeret. Så sæt to miljøvariabler

PUBSUB_EMULATOR_HOST=localhost:8085

PUBSUB_PROJECT_ID=pubsubdemo

Udgiverapplikation

Generelt har vi en Publisher-applikation. Denne applikation kontrollerer, om emnet findes i Pub-Sub-tjenesten, og hvis ikke, opretter det emnet. Når den først har oprettet emnet, sender den dataene via en besked til Pub-Sub-tjenesteemnet.

Koden til denne applikation vil se ud som nedenfor:


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();

Lad os omvendt se på forbrugerapplikationen.


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);

Grundlæggende verificerer denne forbrugerapplikation, om abonnementet eksisterer, hvis ikke det opretter et abonnement mod det emne, hvor vores udgiverapplikation sender beskeder. Når beskeden ankommer i pub-sub-emnet, trækker forbrugerapplikationen denne besked. Denne applikation implementerer PULL-modellen af ​​pub-sub.

Demo

Når vi starter pubsub service emulator, vil vi se loggen som nedenfor:

Lad os nu køre udgiverapplikationen, og vi vil se en konsollog over meddelelsesudgivelse

Hvis du kører det samme program, vil du ikke se beskeden Topic PubSubExample created .

Hvis du nu udfører forbrugerapplikationen, trækker vi den besked, som udgiveren har sendt til emnet.

Samme demo med en simpel vævevideo her.

Konklusion

I dette indlæg viste jeg, hvordan man bruger Pub Sub med NodeJS-applikationen. Pub-Sub er en kraftfuld model til brug i virksomhedsapplikationer. Det giver os mulighed for at bygge tjenester, der kan kommunikere asynkront. Hvis du har flere spørgsmål om dette emne, er du velkommen til at kontakte mig.


Java tag