Megbízható Websocket létrehozása subprotocol használatával

Ha a Websocket-ügyfélkapcsolatok időszakos hálózati problémák miatt megszakadnak, az üzenetek elveszhetnek. A pubokban/alrendszerekben a közzétevők függetlenednek az előfizetőktől, így előfordulhat, hogy a közzétevők nem észlelik az előfizetők megszakadt kapcsolatát vagy üzenetvesztését. Fontos, hogy az ügyfelek leküzdjék az időszakos hálózati problémákat, és megbízható üzenetkézbesítést tartsanak fenn. Ennek érdekében megbízható Websocket-ügyfelet hozhat létre megbízható Azure Web PubSub-alprojektek segítségével.

Reliable Protocol

A Web PubSub szolgáltatás két megbízható alprojektet json.reliable.webpubsub.azure.v1 és protobuf.reliable.webpubsub.azure.v1. A megbízhatóság eléréséhez az ügyfeleknek követniük kell az alprotocol közzétevői, előfizetői és helyreállítási részeit. Ha nem sikerül megfelelően implementálni az alprotocolt, az azt eredményezheti, hogy az üzenetkézbesítés nem a várt módon működik, vagy a szolgáltatás protokollhibák miatt leállíthatja az ügyfelet.

Az egyszerű módszer – Az ügyféloldali SDK használata

A megbízható ügyfél létrehozásának legegyszerűbb módja az ügyféloldali SDK használata. Az ügyféloldali SDK a Web PubSub ügyfélspecifikációját implementálja, és alapértelmezés szerint használjajson.reliable.webpubsub.azure.v1. Az első lépésekért tekintse meg a Közzététel/előfizetés az ügyfelek között című témakört.

A kemény út - Implementálás kézzel

Az alábbi oktatóanyag bemutatja a Web PubSub-ügyfél specifikációjának implementálásának fontos részét. Ez az útmutató nem azoknak szól, akik gyors kezdést keresnek, de szeretnék megismerni a megbízhatóság elvét. Első lépésként használja az ügyféloldali SDK-t.

Inicializálás

A megbízható alprotocolok használatához be kell állítania az alprotocolt a Websocket-kapcsolatok létrehozásakor. A JavaScriptben a következő kódot használhatja:

  • Json reliable subprotocol használata:

    var pubsub = new WebSocket(
      "wss://test.webpubsub.azure.com/client/hubs/hub1",
      "json.reliable.webpubsub.azure.v1"
    );
    
  • Használja a Protobuf reliable subprotocolt:

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

Csatlakozás ion recovery

A Csatlakozás ion recovery a megbízhatóság elérésének alapja, amelyet a protokollok és protobuf.reliable.webpubsub.azure.v1 a json.reliable.webpubsub.azure.v1 protokollok használata során kell megvalósítani.

A websocket-kapcsolatok TCP-n alapulnak. Ha a kapcsolat nem csökken, az üzenetek veszteségmentesek, és sorrendben érkeznek. Az eldobott kapcsolatok üzenetvesztésének megakadályozása érdekében a Web PubSub szolgáltatás megőrzi a kapcsolat állapotadatait, beleértve a csoport- és üzenetinformációkat is. Ezek az információk az ügyfél kapcsolat-helyreállításkor történő visszaállítására szolgálnak

Amikor az ügyfél megbízható alprojektek használatával újra csatlakozik a szolgáltatáshoz, az ügyfél egy Connected üzenetet kap, amely tartalmazza az és reconnectionTokena connectionId . A connectionId kapcsolat munkamenetét azonosítja a szolgáltatásban.

{
  "type": "system",
  "event": "connected",
  "connectionId": "<connection_id>",
  "reconnectionToken": "<reconnection_token>"
}

A WebSocket-kapcsolat megszakadása után az ügyfélnek meg kell próbálnia újracsatlakozni ugyanazzal connectionId a munkamenettel. Az ügyfeleknek nem kell tárgyalnia a kiszolgálóval, és le kell szereznie a access_token. Ehelyett a kapcsolat helyreállításához az ügyfélnek egy WebSocket csatlakozási kérelmet kell küldenie közvetlenül a szolgáltatáshoz a szolgáltatás gazdagépének nevével, connection_idés reconnection_token:

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

Csatlakozás ion helyreállítás sikertelen lehet, ha a hálózati probléma még nem lett helyreállítva. Az ügyfélnek a következő időpontig kell újrapróbálkoznia az újracsatlakozáshoz:

  1. A Websocket-kapcsolat 1008-at tartalmazó állapotkóddal van lezárva. Az állapotkód azt jelenti, hogy a connectionId el lett távolítva a szolgáltatásból.
  2. A helyreállítási hiba több mint 1 percig tart.

Publisher

Az eseményeket eseménykezelőknek küldő vagy más ügyfeleknek üzeneteket közzétevőnek nevezik. A közzétevőknek az üzenetben be kell állítaniuk ackId , hogy a Web PubSub szolgáltatás nyugtázást kapjon arról, hogy az üzenet közzététele sikeres volt vagy sem.

Az ackId üzenet azonosítója, minden új üzenetnek egyedi azonosítót kell használnia. Az eredetit ackId kell használni egy üzenet ismételt elküldésekor.

Egy mintacsoport küldési üzenete:

{
  "type": "sendToGroup",
  "group": "group1",
  "dataType": "text",
  "data": "text data",
  "ackId": 1
}

Minta ack válasz:

{
  "type": "ack",
  "ackId": 1,
  "success": true
}

Amikor a Web PubSub szolgáltatás egy nem megfelelő választ success: truead vissza, a szolgáltatás feldolgozta az üzenetet, és az ügyfél számíthat arra, hogy az üzenet minden előfizetőhöz eljut.

Ha a szolgáltatás átmeneti belső hibát tapasztal, és az üzenet nem küldhető el az előfizetőnek, a közzétevő kap egy hibát a következővel success: false: . A közzétevőnek el kell olvasnia a hibát annak megállapításához, hogy újra szeretné-e elküldeni az üzenetet. Ha az üzenet újraküldésre kerül, ugyanezt ackId kell használni.

{
  "type": "ack",
  "ackId": 1,
  "success": false,
  "error": {
    "name": "InternalServerError",
    "message": "Internal server error"
  }
}

Message Failure

Ha a szolgáltatás nem megfelelő válasza elvész, mert a WebSocket-kapcsolat megszakadt, a közzétevőnek a helyreállítás után ugyanazzal ackId az üzenettel kell újra elküldenie az üzenetet. Amikor a szolgáltatás korábban feldolgozta az üzenetet, hibaüzenetet küld Duplicate . A közzétevőnek le kell állítania az üzenet újraküldését.

{
  "type": "ack",
  "ackId": 1,
  "success": false,
  "error": {
    "name": "Duplicate",
    "message": "Message with ack-id: 1 has been processed"
  }
}

Message duplicated

Előfizető

Az eseménykezelőktől vagy közzétevőktől üzeneteket fogadó ügyfeleket előfizetőknek nevezzük. Ha hálózati problémák miatt megszakadnak a kapcsolatok, a Web PubSub szolgáltatás nem tudja, hány üzenetet küldtek az előfizetőknek. Az előfizető által kapott utolsó üzenet meghatározásához a szolgáltatás egy adatüzenetet küld, amely egy sequenceId. Az előfizető a következő sorrendben válaszol:

Mintaütemezés ack:

{
  "type": "sequenceAck",
  "sequenceId": 1
}

Ez sequenceId egy uint64 növekményes szám egy kapcsolatazonosító munkamenetben. Az előfizetőknek a legnagyobb sequenceId fogadott üzenetet kell rögzítenie, csak a nagyobb sequenceIdméretű üzeneteket kell fogadniuk, és kisebb vagy egyenlő sequenceIdüzeneteket kell elvetni. Az előfizetőnek a legnagyobb sequenceId rögzített értékkel kell rendelkeznie, hogy a szolgáltatás kihagyhassa az előfizetők által már fogadott üzeneteket. Ha például az előfizető egy sequenceAck üzenettel sequenceId: 5válaszol, a szolgáltatás csak 5-nél nagyobb üzenetekkel sequenceId küldi újra az üzeneteket.

A rendszer az összes üzenetet a WebSocket-kapcsolat megszakadásáig sorrendben kézbesíti az előfizetőknek. Ezzel sequenceIda szolgáltatás tudja, hogy az előfizetők hány üzenetet kaptak a WebSocket-kapcsolatok között egy munkamenetben. A WebSocket-kapcsolat megszakadása után a szolgáltatás újra kézbesíti az előfizető által nem fogadott üzeneteket. A szolgáltatás korlátozott számú ismeretlen üzenetet tárol. Ha az üzenetek száma meghaladja a korlátot, a szolgáltatás bezárja a WebSocket-kapcsolatot, és eltávolítja a munkamenetet. Így az előfizetőknek a lehető leghamarabb meg kell akadályozni.sequenceId