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.v1destekler. İ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 reconnectionTokeniç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_tokengerekmez. Bunun yerine, bağlantıyı kurtarmak için istemcinin hizmet ana bilgisayar adı connection_id, ve reconnection_tokenolan 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:

  1. Websocket bağlantısı 1008 durum koduyla kapatılır. Durum kodu, connectionId değerinin hizmetten kaldırıldığı anlamına gelir.
  2. 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: truebir 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: falsebir 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"
  }
}

Message Failure

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"
  }
}

Message duplicated

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 sequenceIdbir 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 sequenceIdolan iletileri kabul etmeli ve daha küçük veya eşit sequenceIdolan 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: 5yanı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 sequenceIdhizmet, 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.