Aracılığıyla paylaş


JavaScript için Web PubSub istemci kitaplığı

Azure Web PubSub, geliştiricilerin büyük ölçekte yayımlama-abone olma desenleriyle web uygulamalarında gerçek zamanlı özellikleri kolayca oluşturmalarına yardımcı olan bir bulut hizmetidir.

Sunucu ve istemciler arasında veya yayımlama-abone olma desenlerini izleyen istemciler arasında gerçek zamanlı mesajlaşma gerektiren tüm senaryolar Web PubSub'un kullanılmasından yararlanabilir. Geliştiricilerin artık belirli aralıklarla yinelenen HTTP istekleri göndererek sunucuyu yoklaması gerekmez ve bu da boşa harcanıp ölçeklendirilmesi zor olur.

Aşağıdaki diyagramda gösterildiği gibi, istemcileriniz Web PubSub kaynağınızla WebSocket bağlantıları kurar. Bu istemci kitaplığı:

  • istemci bağlantılarını yönetmeyi kolaylaştırır
  • istemciler arasında ileti göndermeyi kolaylaştırır
  • İstenmeyen istemci bağlantısı bırakıldıktan sonra otomatik olarak yeniden denenir
  • bağlantı bırakıldıktan sonra iletileri sayı ve sırayla güvenilir bir şekilde teslim ediyor

taşma

Burada kullanılan terimlerle ilgili ayrıntılar temel kavramlar bölümünde açıklanmıştır.

Bu kitaplık NPMüzerinde barındırılır.


Başlarken

Şu anda desteklenen ortamlar

  • Node.js LTS sürümleri

Önkoşullar

1. @azure/web-pubsub-client paketini yükleyin

npm install @azure/web-pubsub-client

2. Web PubSub kaynağınıza bağlanma

İstemci, wss://<service_name>.webpubsub.azure.com/client/hubs/<hub_name>?access_token=<token>desenini izleyen hizmete bağlanmak ve hizmetle kimlik doğrulaması yapmak için bir İstemci Erişim URL'si kullanır. İstemcinin İstemci Erişimi URL'sini almak için birkaç yolu olabilir. Bu hızlı başlangıç için aşağıda gösterilen Azure Portalı'ndan kopyalayıp yapıştırabilirsiniz. (Üretim için, istemcileriniz genellikle uygulama sunucunuzda genleşen İstemci Erişimi URL'sini alır. Aşağıdaki ayrıntılara bakın )

get_client_url

Yukarıdaki diyagramda gösterildiği gibi, istemcinin "group1" adlı belirli bir gruba ileti gönderme ve gruba katılma izinleri vardır.

// Imports the client libray
const { WebPubSubClient } = require("@azure/web-pubsub-client");

// Instantiates the client object
const client = new WebPubSubClient("<client-access-url>");

// Starts the client connection with your Web PubSub resource
await client.start();

// ...
// The client can join/leave groups, send/receive messages to and from those groups all in real-time

3. Gruplara katılma

İstemcinin yalnızca katıldığı gruplardan ileti alabildiğini ve iletileri alırken mantığı belirtmek için geri çağırma eklemeniz gerektiğini unutmayın.

// ...continues the code snippet from above

// Specifies the group to join
const groupName = "group1";

// Registers a listener for the event 'group-message' early before joining a group to not miss messages
client.on("group-message", (e) => {
  console.log(`Received message: ${e.message.data}`);
});

// A client needs to join the group it wishes to receive messages from
await client.joinGroup(groupName);

4. Gruba ileti gönderme

// ...continues the code snippet from above

// Send a message to a joined group
await client.sendToGroup(groupName, "hello world", "text");

// In the Console tab of your developer tools found in your browser, you should see the message printed there.

Örnekler

Bağlı, bağlantısı kesilmiş ve durdurulmuş olaylar için geri çağırmalar ekleme

  1. Bir istemci Web PubSub kaynağınıza başarıyla bağlandığında, connected olayı tetikler.
client.on("connected", (e) => {
  console.log(`Connection ${e.connectionId} is connected.`);
});
  1. İstemcinin bağlantısı kesildiğinde ve bağlantı kurtarılamıyorsa, disconnected olayı tetikler.
client.on("disconnected", (e) => {
  console.log(`Connection disconnected: ${e.message}`);
});
  1. stopped olayı, istemcinin bağlantısı kesildiğinde tetiklenir ve istemci yeniden bağlanmayı denemeyi durdurur. Bu durum genellikle client.stop() çağrıldıktan veya autoReconnect devre dışı bırakıldıktan veya yeniden bağlanmaya çalışmak için belirtilen sınıra ulaşıldıktan sonra gerçekleşir. İstemciyi yeniden başlatmak istiyorsanız durdurulan olayda client.start() çağırabilirsiniz.
// Registers a listener for the "stopped" event
client.on("stopped", () => {
  console.log(`Client has stopped`);
});

programlı olarak İstemci Erişimi URL'si oluşturmak için anlaşma sunucusu kullanma

Üretimde istemciler genellikle bir uygulama sunucusundan İstemci Erişimi URL'sini getirir. Sunucu, Web PubSub kaynağınızın bağlantı dizesini tutar ve @azure/web-pubsubsunucu kitaplığının yardımıyla İstemci Erişimi URL'sini oluşturur.

1. Uygulama sunucusu

Aşağıdaki kod parçacığı, uygulama sunucusunun bir /negotiate yolunu kullanıma sunma ve İstemci Erişimi URL'sini döndürme örneğidir.

// This code snippet uses the popular Express framework
const express = require('express');
const app = express();
const port = 8080;

// Imports the server library, which is different from the client library
const { WebPubSubServiceClient } = require('@azure/web-pubsub');
const hubName = 'sample_chat';

const serviceClient = new WebPubSubServiceClient("<web-pubsub-connectionstring>", hubName);

// Note that the token allows the client to join and send messages to any groups. It is specified with the "roles" option.
app.get('/negotiate', async (req, res) => {
  const token = await serviceClient.getClientAccessToken({roles: ["webpubsub.joinLeaveGroup", "webpubsub.sendToGroup"] });
  res.json({
    url: token.url
  });
});

app.listen(port, () => console.log(`Application server listening at http://localhost:${port}/negotiate`));

2. İstemci tarafı

Aşağıdaki kod parçacığı, istemci tarafının bir örneğidir.

const { WebPubSubClient } = require("@azure/web-pubsub-client")

const client = new WebPubSubClient({
  getClientAccessUrl: async () => {
    const value = await (await fetch(`/negotiate`)).json();
    return value.url;
  }
});

await client.start();

Bu örneğin tam kodunu görmek için lütfen samples-browserkonusuna bakın.


İstemci, uygulama sunucusundan veya birleştirilmiş gruplardan gelen iletileri tüketir

İstemci, uygulama sunucunuzdan veya gruplarınızdan gelen iletileri kullanmak için geri çağırmalar ekleyebilir. group-message olay için istemcinin yalnızca katıldığı grup iletilerini olabileceğini lütfen unutmayın.

// Registers a listener for the "server-message". The callback will be invoked when your application server sends message to the connectionID, to or broadcast to all connections.
client.on("server-message", (e) => {
  console.log(`Received message ${e.message.data}`);
});

// Registers a listener for the "group-message". The callback will be invoked when the client receives a message from the groups it has joined.
client.on("group-message", (e) => {
    console.log(`Received message from ${e.message.group}: ${e.message.data}`);
});

Yeniden katılma hatasını işleme

bir istemcinin bağlantısı kesildiğinde ve kurtarılamadığında, Web PubSub kaynağınızda tüm grup bağlamları temizlenir. Bu, istemci yeniden bağlandığında gruplara yeniden katılması gerektiği anlamına gelir. Varsayılan olarak, istemcide autoRejoinGroup seçeneği etkindir.

Ancak, autoRejoinGroupsınırlamalarını bilmeniz gerekir.

  • İstemci yalnızca başlangıçta istemci koduyla birleştirilen gruplara yeniden bağlanabilir sunucu tarafı kodu tarafından.
  • "Gruba yeniden katılma" işlemleri çeşitli nedenlerle başarısız olabilir; örneğin istemcinin gruplara katılma izni yoktur. Böyle durumlarda, bu hatayı işlemek için bir geri çağırma eklemeniz gerekir.
// By default autoRejoinGroups=true. You can disable it by setting to false.
const client = new WebPubSubClient("<client-access-url>", { autoRejoinGroups: true });

// Registers a listener to handle "rejoin-group-failed" event
client.on("rejoin-group-failed", e => {
  console.log(`Rejoin group ${e.group} failed: ${e.error}`);
})

İşlem ve yeniden deneme

Varsayılan olarak, client.joinGroup(), client.leaveGroup(), client.sendToGroup(), client.sendEvent() gibi işlem üç yeniden denemeye sahiptir. messageRetryOptionsaracılığıyla yapılandırabilirsiniz. Tüm yeniden denemeler başarısız olursa bir hata oluşturulur. Web PubSub hizmetinin işlemi yinelenenleri kaldırabilmesi için önceki yeniden denemelerle aynı ackId geçirerek yeniden denemeye devam edebilirsiniz.

try {
  await client.joinGroup(groupName);
} catch (err) {
  let id = null;
  if (err instanceof SendMessageError) {
    id = err.ackId;
  }
  await client.joinGroup(groupName, {ackId: id});
}

Altprotocol belirtme

İstemci tarafından kullanılacak altprotokolü değiştirebilirsiniz. varsayılan olarak, istemci json.reliable.webpubsub.azure.v1kullanır. json.reliable.webpubsub.azure.v1 veya json.webpubsub.azure.v1kullanmayı seçebilirsiniz.

// Change to use json.webpubsub.azure.v1
const client = new WebPubSubClient("<client-access-url>", { protocol: WebPubSubJsonProtocol() });
// Change to use json.reliable.webpubsub.azure.v1
const client = new WebPubSubClient("<client-access-url>", { protocol: WebPubSubJsonReliableProtocol() });

Temel kavramlar

Bağlantı

İstemci veya istemci bağlantısı olarak da bilinen bağlantı, Web PubSub'a bağlı tek bir WebSocket bağlantısını temsil eder. Başarıyla bağlandığında, Web PubSub tarafından bu bağlantıya benzersiz bir bağlantı kimliği atanır. Her WebPubSubClient kendi özel bağlantısını oluşturur.

Kurtarma

Güvenilir protokoller kullanan bir istemcinin bağlantısı kesilirse, yeni bir WebSocket kayıp bağlantının bağlantı kimliğini kullanarak kurmaya çalışır. Yeni WebSocket bağlantısı başarıyla bağlanırsa, bağlantı kurtarılır. bir istemcinin bağlantısı kesildiği süre boyunca, hizmet istemcinin bağlamını ve istemcinin abone olduğu tüm iletileri korur ve istemci kurtarıldığında, hizmet bu iletileri istemciye gönderir. Hizmet WebSocket hata kodunu 1008 döndürürse veya kurtarma girişimi 30 saniyeden uzun sürerse kurtarma başarısız olur.

Yeniden bağlanma

yeniden bağlantı, istemci bağlantısı kesildiğinde ve kurtarılamadığında gerçekleşir. Yeniden bağlantı yeni bir bağlantı başlatır ve yeni bağlantının yeni bir bağlantı kimliği vardır. Kurtarmadan farklı olarak, hizmet yeniden bağlanan istemciye yeni bir istemci bağlantısı olarak davranır. İstemci bağlantısının gruplara yeniden katılması gerekir. Varsayılan olarak, istemci kitaplığı yeniden bağlandıktan sonra gruplara yeniden katılır.

Göbek

Hub, bir dizi istemci bağlantısı için mantıksal bir kavramdır. Genellikle bir hub'ı sohbet hub'ı veya bildirim hub'ı gibi tek bir amaç için kullanırsınız. İstemci bağlantısı oluşturulduğunda bir hub'a bağlanır ve kullanım ömrü boyunca bu hub'a aittir. Farklı uygulamalar, farklı hub adlarını kullanarak bir Web PubSub'ı paylaşabilir.

Grup

Grup, hub'a yönelik bağlantıların bir alt kümesidir. Bir gruba istemci bağlantısı ekleyebilir veya istemci bağlantısını istediğiniz zaman gruptan kaldırabilirsiniz. Örneğin, bir istemci bir sohbet odasına katıldığında veya bir istemci sohbet odasından ayrıldığında, bu sohbet odası bir grup olarak kabul edilebilir. bir istemci birden çok gruba katılabilir ve bir grup birden çok istemci içerebilir.

Kullanıcı

Web PubSub bağlantıları tek bir kullanıcıya ait olabilir. Bir kullanıcının birden çok bağlantısı olabilir; örneğin, tek bir kullanıcı birden çok cihaza veya birden çok tarayıcı sekmesine bağlandığında.


İstemci Ömrü

Web PubSub istemcilerinin her birinin önbelleğe alınması güvenlidir ve uygulamanın ömrü boyunca tekil olarak kullanılır. Kayıtlı olay geri çağırmaları istemciyle aynı ömrü paylaşır. Bu, istediğiniz zaman geri çağırma ekleyebileceğiniz veya kaldırabileceğiniz ve yeniden bağlantı veya istemci durdurulduktan sonra kayıt durumunun değişmeyeceği anlamına gelir.


JavaScript Paketi

Bu istemci kitaplığını tarayıcıda kullanmak için önce bir paketleyici kullanmanız gerekir. Bunun nasıl yapılacağının ayrıntıları için lütfen paketleme belgelerimize bakın.


Sorun giderme

  • Günlükleri etkinleştirme

    Bu kitaplığı kullanırken hata ayıklama günlüklerini almak için aşağıdaki ortam değişkenini ayarlayabilirsiniz.

export AZURE_LOG_LEVEL=verbose

Günlükleri etkinleştirme hakkında daha ayrıntılı yönergeler için @azure/günlükçü paketi belgelerine bakabilirsiniz.

  • Canlı İzleme

    Canlı trafiği görüntülemek için Web PubSub portalından Canlı İzleme aracını kullanın.


Ek kaynaklar


Katkıda

Bu kitaplığa katkıda bulunmak istiyorsanız kodu oluşturma ve test etme hakkında daha fazla bilgi edinmek için lütfen katkıda bulunma kılavuzu okuyun.