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 reconnectionToken
a 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:
- 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.
- 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: true
ad 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"
}
}
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"
}
}
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 sequenceId
mé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: 5
vá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 sequenceId
a 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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: