Azure Web PubSub Reliable JSON WebSocket altprotocol

JSON WebSocket altprotokolü, json.reliable.webpubsub.azure.v1yukarı akış sunucusuna gidiş dönüş yapmadan, istemciler arasında doğrudan istemciler arasında yayımlama/abone olma iletilerinin son derece güvenilir bir şekilde değişimini sağlar.

Bu belgede altprotocol açıklanmaktadır json.reliable.webpubsub.azure.v1.

WebSocket istemci bağlantıları aralıklı ağ sorunları nedeniyle bırakıldığında, iletiler kaybolabilir. Bir pub/sub sisteminde yayımcılar abonelerden ayrılmıştır ve bir abonenin bırakılan bağlantısını veya ileti kaybını algılamayabilir.

Aralıklı ağ sorunlarının üstesinden gelmek ve güvenilir ileti teslimini sürdürmek için Azure WebPubSub json.reliable.webpubsub.azure.v1 altprotocol'unu kullanarak Reliable PubSub WebSocket istemcisi oluşturabilirsiniz.

Reliable PubSub WebSocket istemcisi şu işlemleri yapabilir:

Örneğin, aşağıdaki JavaScript koduyla Reliable PubSub WebSocket istemcisi oluşturabilirsiniz:

var pubsub = new WebSocket('wss://test.webpubsub.azure.com/client/hubs/hub1', 'json.reliable.webpubsub.azure.v1');

Bkz. Yayımcı ve abone istemcileri için yeniden bağlantı ve ileti güvenilirliği uygulamak üzere güvenilir istemciler oluşturma.

İstemci bu altprotocol'ı kullanırken, hem giden hem de gelen veri çerçeveleri JSON yükleri içermelidir.

İzinler

PubSub WebSocket istemcisi yalnızca yetkili olduğunda diğer istemcilere yayımlayabilir. roles İstemciye atanan, istemciye verilen izinleri belirler:

Role İzin
Belirtilmemiş İstemci olay istekleri gönderebilir.
webpubsub.joinLeaveGroup İstemci herhangi bir gruba katılabilir/gruptan ayrılabilir.
webpubsub.sendToGroup İstemci, iletileri herhangi bir gruba yayımlayabilir.
webpubsub.joinLeaveGroup.<group> İstemci gruba katılabilir/gruptan <group>ayrılabilir.
webpubsub.sendToGroup.<group> İstemci, grubuna <group>ileti yayımlayabilir.
webpubsub.joinLeaveGroups.<pattern> İstemci adı eşleşen <pattern> herhangi bir gruba katılabilir/gruptan ayrılabilir (bkz. Joker karakter grubu rol desenleri).
webpubsub.sendToGroups.<pattern> İstemci, adı eşleşen <pattern> herhangi bir gruba ileti yayımlayabilir (bkz. Joker karakter grubu rol desenleri).

Sunucu REST API'leri veya sunucu SDK'ları aracılığıyla istemci izinlerini dinamik olarak verebilir veya iptal edebilir.

Uyarı

Joker karakter rolleri (örn. webpubsub.sendToGroups.<pattern>) çalışma zamanı sırasında REST API'lerinde veya sunucu SDK'larında henüz desteklenmemektedir.

İstekler

Grupları birleştirme

Biçim:

{
    "type": "joinGroup",
    "group": "<group_name>",
    "ackId" : 1
}

Grup bırakma

Biçim:

{
    "type": "leaveGroup",
    "group": "<group_name>",
    "ackId" : 1
}

İletileri yayımlama

Biçim:

{
    "type": "sendToGroup",
    "group": "<group_name>",
    "ackId" : 1,
    "noEcho": true|false,
    "dataType" : "json|text|binary",
    "data": {}, // data can be string or valid json token depending on the dataType 
}
  • ackId her isteğin kimliğidir ve benzersiz olmalıdır. Hizmet, isteğin işlem sonucunu bildirmek için bir hata yanıtı iletisi gönderir. Ayrıntılar için bkz . AckId ve Ack Yanıtı
  • noEcho isteğe bağlıdır. True olarak ayarlanırsa, bu ileti aynı bağlantıya geri döndürülemez. Ayarlanmadıysa varsayılan değer false olur.
  • dataType, veya jsontextolarak binaryayarlanabilir:
    • json: data JSON'un desteklediği ve olduğu gibi yayımlanacak herhangi bir tür olabilir; Belirtilmezse dataType , varsayılan olarak olur json.
    • text: data dize biçiminde olmalıdır ve dize verileri yayımlanacaktır;
    • binary: data base64 biçiminde olmalı ve ikili veriler yayımlanacaktır;

Olay 1: metin verilerini yayımlama:

{
    "type": "sendToGroup",
    "group": "<group_name>",
    "dataType" : "text",
    "data": "text data",
    "ackId": 1
}
  • içindeki alt protokol istemcileri <group_name> :
{
    "type": "message",
    "from": "group",
    "group": "<group_name>",
    "dataType" : "text",
    "data" : "text data"
}
  • içindeki <group_name> basit WebSocket istemcileri dizesini text dataalır.

Olay 2: JSON verilerini yayımlama:

{
    "type": "sendToGroup",
    "group": "<group_name>",
    "dataType" : "json",
    "data": {
        "hello": "world"
    }
}
  • içindeki alt protokol istemcileri <group_name> :
{
    "type": "message",
    "from": "group",
    "group": "<group_name>",
    "dataType" : "json",
    "data" : {
        "hello": "world"
    }
}
  • içindeki <group_name> basit WebSocket istemcileri serileştirilmiş dizesini {"hello": "world"}alır.

Olay 3: ikili verileri yayımlama:

{
    "type": "sendToGroup",
    "group": "<group_name>",
    "dataType" : "binary",
    "data": "<base64_binary>",
    "ackId": 1
}
  • içindeki alt protokol istemcileri <group_name> :
{
    "type": "message",
    "from": "group",
    "group": "<group_name>",
    "dataType" : "binary",
    "data" : "<base64_binary>", 
}
  • içindeki <group_name> basit WebSocket istemcileri ikili çerçevedeki ikili verileri alır.

Özel olaylar gönderme

Biçim:

{
    "type": "event",
    "event": "<event_name>",
    "ackId": 1,
    "dataType" : "json|text|binary",
    "data": {}, // data can be string or valid json token depending on the dataType 
}

dataType, textveya binarytürlerinden jsonbiri olabilir:

  • json: veriler json'un desteklediği herhangi bir tür olabilir ve olduğu gibi yayımlanır; Varsayılan değerdir json.
  • text: veriler dize biçimindedir ve dize verileri yayımlanır;
  • binary: veriler base64 biçimindedir ve ikili veriler yayımlanır;

Olay 1: metin verileriyle olay gönderme:

{
    "type": "event",
    "event": "<event_name>",
    "ackId": 1,
    "dataType" : "text",
    "data": "text data", 
}

Yukarı akış olay işleyicisi şuna benzer verileri alır:

POST /upstream HTTP/1.1
Host: xxxxxx
WebHook-Request-Origin: xxx.webpubsub.azure.com
Content-Type: text/plain
Content-Length: nnnn
ce-specversion: 1.0
ce-type: azure.webpubsub.user.<event_name>
ce-source: /client/{connectionId}
ce-id: {eventId}
ce-time: 2021-01-01T00:00:00Z
ce-signature: sha256={connection-id-hash-primary},sha256={connection-id-hash-secondary}
ce-userId: {userId}
ce-connectionId: {connectionId}
ce-hub: {hub_name}
ce-eventName: <event_name>

text data

Content-Type CloudEvents HTTP isteği için olduğunda değeridir text/plaindataTypetext.

Olay 2: JSON verileriyle olay gönderme:

{
    "type": "event",
    "event": "<event_name>",
    "ackId": 1,
    "dataType" : "json",
    "data": {
        "hello": "world"
    }, 
}

Yukarı akış olay işleyicisi şuna benzer verileri alır:

POST /upstream HTTP/1.1
Host: xxxxxx
WebHook-Request-Origin: xxx.webpubsub.azure.com
Content-Type: application/json
Content-Length: nnnn
ce-specversion: 1.0
ce-type: azure.webpubsub.user.<event_name>
ce-source: /client/{connectionId}
ce-id: {eventId}
ce-time: 2021-01-01T00:00:00Z
ce-signature: sha256={connection-id-hash-primary},sha256={connection-id-hash-secondary}
ce-userId: {userId}
ce-connectionId: {connectionId}
ce-hub: {hub_name}
ce-eventName: <event_name>

{
    "hello": "world"
}

Content-Type CloudEvents HTTP isteği application/jsondataType içinjson

Olay 3: ikili verilerle olay gönderme:

{
    "type": "event",
    "event": "<event_name>",
    "ackId": 1,
    "dataType" : "binary",
    "data": "base64_binary", 
}

Yukarı akış olay işleyicisi şuna benzer verileri alır:

POST /upstream HTTP/1.1
Host: xxxxxx
WebHook-Request-Origin: xxx.webpubsub.azure.com
Content-Type: application/octet-stream
Content-Length: nnnn
ce-specversion: 1.0
ce-type: azure.webpubsub.user.<event_name>
ce-source: /client/{connectionId}
ce-id: {eventId}
ce-time: 2021-01-01T00:00:00Z
ce-signature: sha256={connection-id-hash-primary},sha256={connection-id-hash-secondary}
ce-userId: {userId}
ce-connectionId: {connectionId}
ce-hub: {hub_name}
ce-eventName: <event_name>

binary

Content-Type CloudEvents HTTP isteği için olduğunda değeridir application/octet-streamdataTypebinary. WebSocket çerçevesi, metin iletisi çerçeveleri için biçimlendirilebilir text veya ileti çerçeveleri için binary UTF8 kodlanmış ikili dosyaları olabilir.

Web PubSub hizmeti, ileti açıklanan biçimle eşleşmiyorsa istemciyi reddeder.

Ping

Biçim:

{
    "type": "ping",
}

İstemci, Web PubSub hizmetinin istemcinin canlılığını algılamasını sağlamak için hizmete bir ping ileti gönderebilir.

Sıralı Ack

Biçim:

{
    "type": "sequenceAck",
    "sequenceId": "<sequenceId>",
}

Reliable PubSub WebSocket istemcisi hizmetten bir ileti aldıktan sonra bir sıralı hata iletisi göndermelidir. Daha fazla bilgi için bkz. Güvenilir istemciler oluşturma

  • sequenceId , alınan iletiden alınan artımlı bir uint64 sayısıdır.

Yanıtlar

İstemci tarafından alınan iletiler çeşitli türlerde olabilir: ack, message, systemve pong. Türü message olan iletilerin özelliği vardır sequenceId . İstemci, bir ileti aldıktan sonra hizmete bir Sıralı Ack göndermelidir.

Ack yanıtı

İstek içerdiğinde ackId, hizmet bu istek için bir hata yanıtı döndürür. İstemci uygulaması, bir işlem kullanarak asyncawait ack yanıtını beklemek de dahil olmak üzere bu ack mekanizmasını işlemelidir ve belirli bir süre boyunca ack yanıtı alınmadığında zaman aşımı işleyicisine sahip olmalıdır.

Biçim:

{
    "type": "ack",
    "ackId": 1, // The ack id for the request to ack
    "success": false, // true or false
    "error": {
        "name": "Forbidden|InternalServerError|Duplicate",
        "message": "<error_detail>"
    }
}

İstemci uygulaması her zaman veya önce olup successtruefalse olmadığını denetlemelidir. success false Yalnızca istemci tarafından errorokunduğunda.

İleti yanıtı

İstemciler, istemcinin katıldığı bir gruptan veya sunucu yönetim rolünde çalışan, belirli istemcilere veya kullanıcılara ileti gönderen sunucudan yayımlanan iletileri alabilir.

  1. Bir gruptan gelen yanıt iletisi:

    {
        "sequenceId": 1,
        "type": "message",
        "from": "group",
        "group": "<group_name>",
        "dataType": "json|text|binary",
        "data" : {} // The data format is based on the dataType
        "fromUserId": "abc"
    }
    
  2. Sunucudan gelen yanıt iletisi:

    {
        "sequenceId": 1,
        "type": "message",
        "from": "server",
        "dataType": "json|text|binary",
        "data" : {} // The data format is based on the dataType
    }
    

Olay 1: ILE REST API aracılığıyla bağlantıya veri Hello World gönderme Content-Type=text/plain

  • Basit bir WebSocket istemcisi, veri içeren bir Metin WebSocket çerçevesi alır: Hello World;

  • PubSub WebSocket istemcisi JSON'da iletiyi alır:

    {
        "sequenceId": 1,
        "type": "message",
        "from": "server",
        "dataType" : "text",
        "data": "Hello World", 
    }
    

Olay 2: ILE REST API aracılığıyla bağlantıya veri { "Hello" : "World"} gönderme Content-Type=application/json

  • Basit bir WebSocket istemcisi, dize verileri içeren bir metin WebSocket çerçevesi alır: { "Hello" : "World"};

  • PubSub WebSocket istemcisi JSON'da iletiyi alır:

    {
        "sequenceId": 1,
        "type": "message",
        "from": "server",
        "dataType" : "json",
        "data": {
            "Hello": "World"
        }
    }
    

REST API içerik türünü kullanarak Hello World bir dize application/json gönderiyorsa, basit WebSocket istemcisi içinde "Hello World"sarmalanmış JSON dizesini " alır.

Olay 3: ile REST API aracılığıyla bağlantıya ikili veri gönderme Content-Type=application/octet-stream

  • Basit bir WebSocket istemcisi, ikili verileri içeren bir ikili WebSocket çerçevesi alır.

  • PubSub WebSocket istemcisi JSON'da iletiyi alır:

    {
        "sequenceId": 1,
        "type": "message",
        "from": "server",
        "dataType" : "binary",
        "data": "<base64_binary>"
    }
    

Sistem yanıtı

Web PubSub hizmeti, sistemle ilgili yanıtları istemciye döndürebilir.

Pong yanıtı

Web PubSub hizmeti, istemciden bir pong ileti aldığında istemciye bir ping ileti gönderir.

Biçim:

{
    "type": "pong",
}

Bağlandı

İstemci bağlantı isteğine verilen yanıt:

{
    "type": "system",
    "event": "connected",
    "userId": "user1",
    "connectionId": "abcdefghijklmnop",
    "reconnectionToken": "<token>"
}

connectionId ve reconnectionToken yeniden bağlantı için kullanılır. Yeniden bağlantı için uri ile bağlantı isteğinde bulunun:

wss://<service-endpoint>/client/hubs/<hub>?awps_connection_id=<connectionId>&awps_reconnection_token=<reconnectionToken>

Bağlantı Kurtarma'da daha fazla ayrıntı bulabilirsiniz

Bağlantı kesildi

Sunucu bağlantıyı kapattığında veya hizmet istemci bağlantısını reddettidiğinde verilen yanıt:

{
    "type": "system",
    "event": "disconnected",
    "message": "reason"
}

Sonraki adımlar

Kendi uygulamanızı oluşturmaya başlamak için şu kaynakları kullanın: