Altprotocol ile güvenilir Websocket oluşturma
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, bu nedenle yayımcılar bir abonenin bırakılan bağlantısını veya ileti kaybını algılamayabilir. İstemcilerin aralıklı ağ sorunlarını aşması ve güvenilir ileti teslimi sağlaması çok önemlidir. Bunu başarmak için, güvenilir Azure Web PubSub altprotocols yardımıyla güvenilir bir Websocket istemcisi oluşturabilirsiniz.
Güvenilir Protokol
Web PubSub hizmeti iki güvenilir alt protokol json.reliable.webpubsub.azure.v1
ve protobuf.reliable.webpubsub.azure.v1
destekler. İstemcilerin güvenilirlik elde etmek için altprotocol'un yayımcı, abone ve kurtarma bölümlerini izlemesi gerekir. Altprotocol'un düzgün uygulanamaması, ileti tesliminin beklendiği gibi çalışmaması veya hizmetin protokol ihlalleri nedeniyle istemciyi sonlandırmasına neden olabilir.
Kolay Yol - İstemci SDK'sını Kullanma
Güvenilir bir istemci oluşturmanın en basit yolu İstemci SDK'sını kullanmaktır. İstemci SDK'sı , Web PubSub istemci belirtimini uygular ve varsayılan olarak kullanır json.reliable.webpubsub.azure.v1
. Hızlı başlangıç için lütfen İstemciler arasında yayımlama/abone olma bölümüne bakın.
Zor Yol - El ile uygulama
Aşağıdaki öğretici, Web PubSub istemci belirtimini uygulamanın önemli bölümünde size yol gösterir. Bu kılavuz, hızlı bir başlangıç yapmak isteyen ancak güvenilirlik sağlama ilkesini öğrenmek isteyen kişilere yöneliktir. Hızlı başlangıç için lütfen İstemci SDK'sını kullanın.
Başlatma
Güvenilir alt protokolleri kullanmak için Websocket bağlantıları oluştururken altprotokolü ayarlamanız gerekir. JavaScript'te aşağıdaki kodu kullanabilirsiniz:
Json reliable altprotocol kullanın:
var pubsub = new WebSocket( "wss://test.webpubsub.azure.com/client/hubs/hub1", "json.reliable.webpubsub.azure.v1" );
Protobuf reliable subprotocol kullanın:
var pubsub = new WebSocket( "wss://test.webpubsub.azure.com/client/hubs/hub1", "protobuf.reliable.webpubsub.azure.v1" );
Bağlan ion recovery
Bağlan ion kurtarma, güvenilirlik elde etmenin temelini oluşturur ve ve protobuf.reliable.webpubsub.azure.v1
protokolleri kullanılırken json.reliable.webpubsub.azure.v1
uygulanmalıdır.
Websocket bağlantıları TCP'ye dayanır. Bağlantı bırakılmıyorsa iletiler kayıpsız ve sırayla teslim edilir. Bırakılan bağlantılarda ileti kaybını önlemek için Web PubSub hizmeti, grup ve ileti bilgileri de dahil olmak üzere bağlantı durumu bilgilerini korur. Bu bilgiler, bağlantı kurtarmada istemciyi geri yüklemek için kullanılır
İstemci, güvenilir alt protokoller kullanarak hizmete yeniden bağlandığında, istemci ve reconnectionToken
içeren connectionId
bir Connected
ileti alır. , connectionId
hizmetteki bağlantı oturumunu tanımlar.
{
"type": "system",
"event": "connected",
"connectionId": "<connection_id>",
"reconnectionToken": "<reconnection_token>"
}
WebSocket bağlantısı kesildikten sonra istemci, aynı oturumu geri yüklemek için aynı connectionId
bağlantıyla yeniden bağlanmayı denemelidir. İstemcilerin sunucuyla anlaşma ve almaları access_token
gerekmez. Bunun yerine, bağlantıyı kurtarmak için istemcinin hizmet ana bilgisayar adı connection_id
, ve reconnection_token
olan bir WebSocket bağlantı isteği doğrudan hizmete göndermesi gerekir:
wss://<service-endpoint>/client/hubs/<hub>?awps_connection_id=<connection_id>&awps_reconnection_token=<reconnection_token>
Ağ sorunu henüz kurtarılmamışsa Bağlan ion kurtarma başarısız olabilir. İstemci aşağıdakilere kadar yeniden bağlanmayı denemeye devam etmelidir:
- Websocket bağlantısı 1008 durum koduyla kapatılır. Durum kodu, connectionId değerinin hizmetten kaldırıldığı anlamına gelir.
- Kurtarma hatası 1 dakikadan uzun bir süre devam eder.
Yayıncı
Olay işleyicilerine olay gönderen veya diğer istemcilere ileti yayımlayan istemcilere yayımcı adı verilir. Yayımcılar, Web PubSub hizmetinden iletiyi yayımlamanın başarılı olup olmadığını belirten bir bildirim almak için iletide ayarlanmalıdır ackId
.
ackId
, iletinin tanımlayıcısıdır; her yeni ileti benzersiz bir kimlik kullanmalıdır. ackId
Özgün ileti yeniden gönderildiğinde kullanılmalıdır.
Örnek grup gönderme iletisi:
{
"type": "sendToGroup",
"group": "group1",
"dataType": "text",
"data": "text data",
"ackId": 1
}
Örnek bir hata yanıtı:
{
"type": "ack",
"ackId": 1,
"success": true
}
Web PubSub hizmeti ile success: true
bir hata yanıtı döndürdüğünde, ileti hizmet tarafından işlenir ve istemci iletinin tüm abonelere teslim edilmesi beklenebilir.
Hizmet geçici bir iç hatayla karşılaştığında ve ileti aboneye gönderilemediğinde, yayımcı ile success: false
bir hata alır. Yayımcının iletiyi yeniden gönderip göndermeyeceğini belirlemek için hatayı okuması gerekir. İletiye yeniden ileti gönderilirse, aynı ackId
şey kullanılmalıdır.
{
"type": "ack",
"ackId": 1,
"success": false,
"error": {
"name": "InternalServerError",
"message": "Internal server error"
}
}
WebSocket bağlantısı bırakıldığından hizmetin ack yanıtı kaybolursa, yayımcı kurtarma işleminden sonra iletiyi aynı ackId
şekilde yeniden göndermelidir. İleti daha önce hizmet tarafından işlendiğinde hata içeren bir Duplicate
sorun gönderir. Yayımcı bu iletiyi yeniden göndermeyi durdurmalıdır.
{
"type": "ack",
"ackId": 1,
"success": false,
"error": {
"name": "Duplicate",
"message": "Message with ack-id: 1 has been processed"
}
}
Abone
Olay işleyicilerinden veya yayımcılardan ileti alan istemcilere abone adı verilir. Ağ sorunları nedeniyle bağlantılar bırakıldığında, Web PubSub hizmeti abonelere kaç ileti gönderildiğini bilmez. Abone tarafından alınan son iletiyi belirlemek için hizmet, içeren sequenceId
bir veri iletisi gönderir. Abone bir sıralı hata iletisiyle yanıt verir:
Örnek sıralı hata:
{
"type": "sequenceAck",
"sequenceId": 1
}
sequenceId
, bağlantı kimliği oturumundaki uint64 artımlı numarasıdır. Aboneler aldığı en büyük sequenceId
değeri kaydetmeli, yalnızca daha büyük sequenceId
olan iletileri kabul etmeli ve daha küçük veya eşit sequenceId
olan iletileri bırakmalıdır. Abonenin kaydettiği en büyük sequenceId
iletiye sahip olması gerekir; böylece hizmet, abonelerin zaten almış olduğu iletileri yeniden teslim etme işlemini atlayabilir. Örneğin, abone ile sequenceId: 5
yanıt verirsesequenceAck
, hizmet yalnızca 5'ten büyük iletileri sequenceId
yeniden gönderecektir.
WebSocket bağlantısı düşene kadar tüm iletiler abonelere sırayla teslim edilir. ile sequenceId
hizmet, abonelerin bir oturumdaki WebSocket bağlantıları arasında kaç ileti aldığını bilir. WebSocket bağlantısı bırakıldıktan sonra hizmet, abone tarafından onaylanmayan iletileri yeniden teslim eder. Hizmet, sınırlı sayıda bilinmeyen ileti depolar. İleti sayısı sınırı aştığında, hizmet WebSocket bağlantısını kapatır ve oturumu kaldırır. Bu nedenle, aboneler en kısa sürede ack sequenceId
gerekir.