Powiadomienia o zdarzeniach od klientów

W pierwszych trzech artykułach "Szybki start" poznaliśmy dwa przydatne wzorce komunikacji przy użyciu usługi Web PubSub na potrzeby obsługi komunikatów w czasie rzeczywistym na dużą skalę (milion+).

  • Pub/Sub wśród klientów, którzy zwalniają serwer aplikacji z złożoności zarządzania połączeniami trwałymi
  • Wypychanie komunikatów do klientów z serwera aplikacji natychmiast po udostępniniu nowych danych

W tym przewodniku Szybki start dowiesz się więcej o systemie zdarzeń usługi Web PubSub, dzięki czemu serwer aplikacji może reagować na zdarzenia, takie jak w przypadku

  • klient jest connected
  • klient wysyła element message, który wymaga dalszego przetwarzania

GIF of application server receiving client events.

Wymagania wstępne

  • Zasób Web PubSub. Jeśli go nie utworzono, możesz postępować zgodnie ze wskazówkami: Tworzenie zasobu Web PubSub
  • Edytor kodu, taki jak Visual Studio Code
  • Instalowanie zależności dla języka, którego planujesz użyć

Tworzenie aplikacji

Web PubSub to autonomiczna usługa na serwerze aplikacji. Mimo że aplikacja zachowuje swoją rolę jako tradycyjny serwer HTTP, usługa Web PubSub zajmuje się przekazywaniem komunikatów w czasie rzeczywistym między serwerem aplikacji a klientami. Najpierw utworzymy program kliencki, a następnie program serwera.

Tworzenie klienta

1. Tworzenie katalogu dla aplikacji klienckiej

mkdir eventHandlerDemo
cd eventHandlerDemo

# The SDK is available as an NPM module.
npm install @azure/web-pubsub-client

2. Połączenie do usługi Web PubSub

Klient, tzn. przeglądarka, aplikacja mobilna lub urządzenie IoT, używa adresu URL dostępu klienta do nawiązywania połączenia i uwierzytelniania z zasobem. Ten adres URL jest zgodny ze wzorcem .wss://<service_name>.webpubsub.azure.com/client/hubs/<hub_name>?access_token=<token> Klient może mieć kilka sposobów uzyskania adresu URL dostępu klienta. Na potrzeby tego przewodnika Szybki start możesz skopiować i wkleić go z witryny Azure Portal pokazanej na poniższym diagramie. Najlepszym rozwiązaniem jest, aby nie kodować twardego adresu URL dostępu klienta w kodzie. W świecie produkcyjnym zwykle konfigurujemy serwer aplikacji, aby zwracał ten adres URL na żądanie. Wygeneruj adres URL dostępu klienta opisuje szczegółowo praktykę.

The diagram shows how to get Client Access Url.

Utwórz plik o nazwie client.js i dodaj następujący kod

const { WebPubSubClient } = require("@azure/web-pubsub-client");
// Instantiates the client object 
// <client-access-url> is copied from Azure portal mentioned above.
const client = new WebPubSubClient("<client-access-url>");

// Registers a handler to the "connected" event
client.on("connected", (e) => {
  console.log(`Connection ${e.connectionId} is connected.`);
});

// You must invoke start() on the client object 
// to establish connection with your Web PubSub resource
client.start();

Tworzenie serwera aplikacji

1. Zainstaluj plik express.js i zestaw SDK serwera Web PubSub

npm init -y
npm install --save express

# Installs the middleware from Web PubSub. This middleware will set up an endpoint for you.
npm install --save @azure/web-pubsub-express 

2. Utwórz nowy plik o nazwie "server.js", który konfiguruje pustą aplikację ekspresową

const express = require("express");

const app = express();

app.listen(8080, () => console.log('Server started, listening on port 8080'));

3. Obsługa zdarzeń

W przypadku usługi Web PubSub, gdy po stronie klienta występują pewne działania (na przykład gdy klient jest connected lub disconnected z zasobem Web PubSub), serwer aplikacji może skonfigurować programy obsługi w celu reagowania na te zdarzenia.

Oto dwa istotne przypadki użycia:
  • gdy klient jest połączony, można rozgłasić ten stan do wszystkich połączonych klientów
  • gdy klient wysyła komunikat do zasobu Web PubSub, możesz utrwał komunikat w wybranej bazie danych
const express = require("express");
const { WebPubSubEventHandler } = require("@azure/web-pubsub-express");

const app = express();

const HUB_NAME = "myHub1";

let handler = new WebPubSubEventHandler(HUB_NAME, {
  path: '/eventhandler', // Exposes an endpoint 
  onConnected: async (req) => {
    console.log(`${req.context.userId} connected`);
  }, 
});

// Registers the middleware with the express app
app.use(handler.getMiddleware());

app.listen(8080, () => console.log('Server started, listening on port 8080'));

Zgodnie z konfiguracją w powyższym kodzie, gdy klient nawiązuje połączenie z zasobem Web PubSub, usługa Web PubSub wywołuje element webhook obsługiwany przez serwer aplikacji w ścieżce /eventhandler. W tym miejscu po prostu drukujemy element userId do konsoli, gdy użytkownik jest połączony.

Uwidaczniaj hosta lokalnego

Uruchom program. Powinien on działać na localhost porcie 8080. W naszych celach oznacza to, że twoja lokalna aplikacja ekspresowa nie może być osiągana w Internecie. Dlatego usługa Web PubSub nie może wywołać elementu webhook obsługiwanego w ścieżce /eventhandler.

Istnieją dwa sposoby kierowania ruchu do hosta lokalnego. Jednym z nich jest udostępnienie hosta lokalnego w Internecie przy użyciu narzędzi, takich jak ngrok i TunnelRelay. Innym sposobem, a także zalecanym sposobem jest użycie tunelu awps-tunnel do tunelowania ruchu z usługi Web PubSub za pośrednictwem narzędzia do serwera lokalnego.

1. Pobieranie i instalowanie aplikacji awps-tunnel

Narzędzie działa w środowisku Node.js w wersji 16 lub nowszej.

npm install -g @azure/web-pubsub-tunnel-tool

2. Użyj parametry połączenia usługi i uruchom polecenie

export WebPubSubConnectionString="<your connection string>"
awps-tunnel run --hub myHub1 --upstream http://localhost:8080

Ustawianie programu obsługi zdarzeń w zasobie Web PubSub

Teraz musimy poinformować zasób Web PubSub o tym adresie URL elementu webhook. Programy obsługi zdarzeń można ustawić za pomocą witryny Azure Portal lub interfejsu wiersza polecenia platformy Azure.

  1. Wybierz pozycję "Ustawienia" z menu i wybierz pozycję "Dodaj"Screenshot of Azure Web PubSub Configure Event Handler - menu.

  2. Wprowadź nazwę centrum. W naszych celach wprowadź ciąg "myHub1" i wybierz pozycję "Dodaj"

  3. Na stronie obsługi zdarzeń skonfiguruj następujące pola, gdy używasz awps-tunnel narzędzia, szablon adresu URL używa tunnel schematu, po którym następuje ścieżka: tunnel:///eventhandlerScreenshot of Azure Web PubSub Configure Event Handler - details.

  4. Zapisz konfigurację Screenshot of Azure Web PubSub Configure Event Handler - save.

Uruchamianie programów

Uruchamianie serwera aplikacji

node server.js

Uruchamianie programu klienckiego

node client.js

Obserwowanie wyniku

Powinien zostać wyświetlony userId ekran wyświetlany w konsoli programu .

Obsługa zdarzenia komunikatu

Oprócz zdarzeń systemowych, takich jak connect, connected, disconnectedklient może również wysyłać zdarzenia niestandardowe .

Modyfikowanie programu klienckiego

Zatrzymaj program kliencki i dodaj następujący kod do client.js

// ...code from before

client.start();

// The name of the event is message and the content is in text format.
client.sendEvent("message", "sending custom event!", "text");

Modyfikowanie programu serwera

Zatrzymaj program kliencki i dodaj następujący kod do server.js

// ... code from before

let handler = new WebPubSubEventHandler(HUB_NAME, {
  path: "/eventhandler",
  onConnected: async (req) => {
    console.log(`"${req.context.userId}" is connected.`);
  },
  // This handler function will handle user system
  handleUserEvent: async (req, res) => {
    if (req.context.eventName === "message") {
      console.log(`Received message: ${req.data}`);
      // Additional logic to process the data,
      // e.g save message content to database 
      // or broadcast the message to selected clients.
    }
  },
});

//... code from before

Ponownie uruchom program kliencki i program serwera

Powinny zostać wyświetlone zarówno elementy , userId jak i Received message: sending custom event! wydrukowane w konsoli programu .

Podsumowanie

Ten samouczek zawiera podstawowe informacje na temat działania systemu zdarzeń w usłudze Web PubSub. W rzeczywistych aplikacjach system zdarzeń może pomóc zaimplementować większą logikę przetwarzania zdarzeń systemowych i generowanych przez użytkownika.

Następne kroki