Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu belgede altprotocol açıklanmaktadır protobuf.webpubsub.azure.v1.
İstemci bu altprotokolü kullandığında, hem giden hem de gelen veri çerçevelerinin protokol arabellekleri (protobuf) yükleri olması beklenir.
Genel bakış
Altprotocol protobuf.webpubsub.azure.v1 , istemciyi yukarı akış sunucusuna gidiş dönüş yapmak yerine doğrudan yayımlama-abone olma (PubSub) gerçekleştirmesini sağlar. Altprotocol ile protobuf.webpubsub.azure.v1 WebSocket bağlantısı PubSub WebSocket istemcisi olarak adlandırılır.
Örneğin, JavaScript'te aşağıdakileri kullanarak protobuf altprotokolü ile bir PubSub WebSocket istemcisi oluşturabilirsiniz:
// PubSub WebSocket client
var pubsub = new WebSocket('wss://test.webpubsub.azure.com/client/hubs/hub1', 'protobuf.webpubsub.azure.v1');
Basit bir WebSocket istemcisi için sunucu, istemcilerden gelen olayları işlemek için gerekli role sahiptir. Basit bir WebSocket bağlantısı her zaman ileti gönderdiğinde bir message olayı tetikler ve iletileri işlemek ve diğer işlemleri yapmak için her zaman sunucu tarafına dayanır. Altprotocol'un protobuf.webpubsub.azure.v1 yardımıyla, yetkili bir istemci birleştirme isteklerini kullanarak bir gruba katılabilir ve doğrudan yayımlama isteklerini kullanarak iletileri bir gruba yayımlayabilir. İstemci ayrıca, iletinin ait olduğu olayı özelleştirmek için olay isteklerini kullanarak iletileri çeşitli yukarı akış olay işleyicilerine yönlendirebilir.
Not
Şu anda Web PubSub hizmeti yalnızca proto3'i destekler.
İ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.
Not
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
Tüm istek iletileri aşağıdaki protobuf biçimine uyar:
syntax = "proto3";
import "google/protobuf/any.proto";
message UpstreamMessage {
oneof message {
SendToGroupMessage send_to_group_message = 1;
EventMessage event_message = 5;
JoinGroupMessage join_group_message = 6;
LeaveGroupMessage leave_group_message = 7;
SequenceAckMessage sequence_ack_message = 8;
PingMessage ping_message = 9;
}
message SendToGroupMessage {
string group = 1;
optional uint64 ack_id = 2;
MessageData data = 3;
}
message EventMessage {
string event = 1;
MessageData data = 2;
optional uint64 ack_id = 3;
}
message JoinGroupMessage {
string group = 1;
optional uint64 ack_id = 2;
}
message LeaveGroupMessage {
string group = 1;
optional uint64 ack_id = 2;
}
message PingMessage {
}
}
message MessageData {
oneof data {
string text_data = 1;
bytes binary_data = 2;
google.protobuf.Any protobuf_data = 3;
}
}
Grupları birleştirme
Biçim:
Grup adına ayarlayın join_group_message.group .
-
ackIdher 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. Daha fazla ayrıntı AckId ve Ack Yanıtı'nda bulunabilir
Grup bırakma
Biçim:
Grup adına ayarlayın leave_group_message.group .
-
ackIdher 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. Daha fazla ayrıntı AckId ve Ack Yanıtı'nda bulunabilir
İletileri yayımlama
Biçim:
ackId: Her isteğin benzersiz kimliği. Hizmet, isteğin işlem sonucunu bildirmek için bir hata yanıtı iletisi gönderir. Daha fazla ayrıntı AckId ve Ack Yanıtı'nda bulunabilirdataType: , veyaprotobufiçindekine bağlıtextbinaryolarak veridataMessageDatabiçimi. Alıcı istemciler, içeriği doğru şekilde işlemek için kullanabilirdataType.protobuf: ayarladığınızdasend_to_group_message.data.protobuf_dataörtükdataTypedeğeridirprotobuf.protobuf_dataherhangi bir ileti türünde olabilir. Diğer tüm istemciler protobuf sdk'sı tarafından seri durumdan çıkarılabilen protobuf kodlu bir ikili dosya alır. Yalnızca metin tabanlı içeriği destekleyen istemciler (örneğin,json.webpubsub.azure.v1) Base64 ile kodlanmış bir ikili alır.text: ayarladığınızdasend_to_group_message.data.text_dataörtükdataTypedeğeridirtext.text_databir dize olmalıdır. Diğer protokollere sahip tüm istemciler UTF-8 ile kodlanmış bir dize alır.binary: ayarladığınızdasend_to_group_message.data.binary_dataörtükdataTypedeğeridirbinary.binary_databir bayt dizisi olmalıdır. Diğer protokollere sahip tüm istemciler, protobuf kodlaması olmadan bir ham ikili alır. Yalnızca metin tabanlı içeriği destekleyen istemciler (örneğin,json.webpubsub.azure.v1) Base64 ile kodlanmış bir ikili alır.
Olay 1: Metin verilerini yayımlama
olarak send_to_group_message.groupayarlayın group ve olarak send_to_group_message.data.text_dataayarlayın"text data".
Gruptaki
groupprotobuf altprotocol istemcisi ikili çerçeveyi alır ve seri durumdan çıkarmak için DownstreamMessage kullanabilir.içindeki JSON altprotocol istemcileri
group:{ "type": "message", "from": "group", "group": "group", "dataType" : "text", "data" : "text data" }içindeki basit WebSocket istemcileri
groupdizesinitext dataalır.
Olay 2: Protobuf verilerini yayımlama
Özel bir iletiniz olduğunu varsayalım:
message MyMessage {
int32 value = 1;
}
ile send_to_group_message.groupolarak group ve send_to_group_message.data.protobuf_data olarak Any.pack(MyMessage) ayarlayınvalue = 1.
içindeki
groupprotobuf altprotocol istemcileri ikili çerçeveyi alır ve seri durumdan çıkarmak için DownstreamMessage kullanabilir.içindeki
groupaltprotocol istemcisi şu değerleri alır:{ "type": "message", "from": "group", "group": "G", "dataType" : "protobuf", "data" : "Ci90eXBlLmdvb2dsZWFwaXMuY29tL2F6dXJlLndlYnB1YnN1Yi5UZXN0TWVzc2FnZRICCAE=" // Base64-encoded bytes }Not
Veriler Base64 kodlanmış, seri durumdan çıkarılabilir bir protobuf ikili dosyasıdır.
Aşağıdaki protobuf tanımını kullanabilir ve seri durumdan çıkarmak için kullanabilirsiniz Any.unpack() :
syntax = "proto3";
message MyMessage {
int32 value = 1;
}
içindeki
groupbasit WebSocket istemcileri ikili çerçeveyi alır:# Show in hexadecimal 0A 2F 74 79 70 65 2E 67 6F 6F 67 6C 65 61 70 69 73 2E 63 6F 6D 2F 61 7A 75 72 65 2E 77 65 62 70 75 62 73 75 62 2E 54 65 73 74 4D 65 73 73 61 67 65 12 02 08 01
Olay 3: İkili verileri yayımlama
olarak send_to_group_message.groupayarlayın group ve olarak send_to_group_message.data.binary_dataayarlayın[1, 2, 3].
Gruptaki
groupprotobuf altprotocol istemcisi ikili çerçeveyi alır ve seri durumdan çıkarmak için DownstreamMessage kullanabilir.Gruptaki
groupJSON altprotocol istemcisi aşağıdakileri alır:{ "type": "message", "from": "group", "group": "group", "dataType" : "binary", "data" : "AQID", // Base64-encoded [1,2,3] }JSON altprotocol istemcisi yalnızca metin tabanlı mesajlaşmayı desteklediğinden, ikili her zaman Base64 kodludur.
içindeki
groupbasit WebSocket istemcileri ikili çerçevedeki ikili verileri alır:# Show in hexadecimal 01 02 03
Özel olaylar gönderme
Ayarladığınıza bağlı olarak dataType , protobufveya textolabilir binaryörtük dataTypebir vardır. Alıcı istemcileri, içeriği doğru şekilde işlemek için kullanabilir dataType .
protobuf: ayarladığınızdaevent_message.data.protobuf_dataörtükdataTypedeğeridirprotobuf. Değerprotobuf_datadesteklenen herhangi bir protobuf türü olabilir. Olay işleyicisi, herhangi bir protobuf SDK'sı tarafından seri durumdan çıkarılabilen protobuf kodlu ikili dosyasını alır.text: ayarladığınızdaevent_message.data.text_dataörtükdataTypedeğeridirtext. Değertext_databir dize olmalıdır. Olay işleyicisi UTF-8 kodlu bir dize alır.binary: ayarladığınızdaevent_message.data.binary_dataörtükdataTypedeğeridirbinary. Değerbinary_databir bayt dizisi olmalıdır. Olay işleyicisi ham ikili çerçeveyi alır.
1. Olay: Metin verileriyle olay gönderme
event_message.data.text_data seçeneğini "text data" olarak ayarlayın.
Yukarı akış olay işleyicisi şuna benzer bir istek 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 , burada şeklindedirtext/plaindataType=text.
Olay 2: Protobuf verileriyle olay gönderme
Aşağıdaki müşteri iletisini aldığınızı varsayın:
message MyMessage {
int32 value = 1;
}
ile olarak event_message.data.protobuf_data ayarlayın any.pack(MyMessage)value = 1
Yukarı akış olay işleyicisi şuna benzer bir istek 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>
// Just show in hexadecimal; read it as binary
0A 2F 74 79 70 65 2E 67 6F 6F 67 6C 65 61 70 69 73 2E 63 6F 6D 2F 61 7A 75 72 65 2E 77 65 62 70 75 62 73 75 62 2E 54 65 73 74 4D 65 73 73 61 67 65 12 02 08 01
Content-Type CloudEvents HTTP isteği için , burada şeklindedirapplication/x-protobufdataType=protobuf.
Veriler geçerli bir protobuf ikili dosyasıdır. Seri durumdan çıkarmak için aşağıdakileri proto ve any.unpack() kullanabilirsiniz:
syntax = "proto3";
message MyMessage {
int32 value = 1;
}
Olay 3: İkili verilerle olay gönderme
send_to_group_message.binary_data seçeneğini [1, 2, 3] olarak ayarlayın.
Yukarı akış olay işleyicisi şuna benzer bir istek 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>
// Just show in hexadecimal; you need to read it as binary
01 02 03
dataType için=binaryContent-Type, CloudEvents HTTP isteği için şeklindedir.application/octet-stream WebSocket çerçevesi, metin iletisi çerçeveleri text için biçiminde veya ileti çerçeveleri için UTF-8 kodlu ikililer biçiminde binary olabilir.
İleti belirtilen biçimle eşleşmiyorsa hizmet istemciyi reddeder.
Ping
İstemci, Web PubSub hizmetinin istemcinin canlılığını algılamasını sağlamak için hizmetine bir PingMessage gönderebilir.
Yanıtlar
Tüm yanıt iletileri aşağıdaki protobuf biçimine uyar:
message DownstreamMessage {
oneof message {
AckMessage ack_message = 1;
DataMessage data_message = 2;
SystemMessage system_message = 3;
PongMessage pong_message = 4;
}
message AckMessage {
uint64 ack_id = 1;
bool success = 2;
optional ErrorMessage error = 3;
message ErrorMessage {
string name = 1;
string message = 2;
}
}
message DataMessage {
string from = 1;
optional string group = 2;
MessageData data = 3;
}
message SystemMessage {
oneof message {
ConnectedMessage connected_message = 1;
DisconnectedMessage disconnected_message = 2;
}
message ConnectedMessage {
string connection_id = 1;
string user_id = 2;
}
message DisconnectedMessage {
string reason = 2;
}
}
message PongMessage {
}
}
İstemci tarafından alınan iletiler şu üç türden birinde olabilir: ack, messageveya systempong.
Ack yanıtı
İstek içeriyorsa ackId, hizmet bu istek için bir hata yanıtı döndürür. İstemci uygulaması aşağıdakiler dahil olmak üzere bu ack mekanizmasını işlemelidir:
- İşlem
asyncawaitiçin ack yanıtı bekleniyor. - Belirli bir süre boyunca ack yanıtının alınmadığında zaman aşımı denetimi yapılması.
İstemci uygulaması her zaman önce durumunun successtrue veya falseolup olmadığını denetlemelidir.
success durum olduğundafalse, istemci hata ayrıntıları için özelliğinden error okuyabilir.
İleti yanıtı
İstemciler, istemcinin katıldığı bir gruptan yayımlanan iletileri alabilir. Ya da sunucu belirli bir istemciye veya belirli bir kullanıcıya ileti gönderdiğinde sunucu yönetim rolünden iletiler alabilirler.
Aşağıdaki senaryolarda her zaman bir DownstreamMessage.DataMessage ileti alırsınız:
- İleti bir gruptan olduğunda,
fromşeklindedirgroup. İleti sunucudan olduğunda,fromşeklindedirserver. - İleti bir gruptan geldiğinde,
groupgrup adıdır.
Gönderenler dataType aşağıdaki iletilerden birinin gönderilmesine neden olur:
- ise
dataTypetextkullanınmessage_response_message.data.text_data. - ise
dataTypebinarykullanınmessage_response_message.data.binary_data. - ise
dataTypeprotobufkullanınmessage_response_message.data.protobuf_data. - ise
dataTypejsonkullanınmessage_response_message.data.text_datave içerik serileştirilmiş bir JSON dizesidir.
Sistem yanıtı
Web PubSub hizmeti, istemciye sistemle ilgili yanıtlar da gönderebilir.
Bağlandı
İstemci hizmete bağlandığında bir DownstreamMessage.SystemMessage.ConnectedMessage ileti alırsınız.
Bağlantı kesildi
Sunucu bağlantıyı kapattığında veya hizmet istemciyi reddettiyse bir DownstreamMessage.SystemMessage.DisconnectedMessage ileti alırsınız.
Pong yanıtı
Web PubSub hizmeti, istemciden bir PongMessage aldığında istemciye bir PingMessage gönderir.
Sonraki adımlar
Kendi uygulamanızı oluşturmaya başlamak için şu kaynakları kullanın: