Bir MQTT topic alias, client'ın uzun bir topic adını bir kez gönderip bağlantının geri kalanında ona iki baytlık bir tamsayıyla başvurmasını sağlar. Hücresel, LoRa backhaul veya uydu gibi kısıtlı bağlantılarda bu, küçük telemetri paketlerinin boyutunu yarıdan fazla azaltabilir. Bu rehber, Topic Alias Maximum'un nasıl belirlendiğini, tasarrufunuzu nasıl hesaplayacağınızı ve alias'ları koddan nasıl doğru kullanacağınızı açıklıyor.
MQTT Topic Alias Nedir?
Topic alias'lar, verimliliği hedefleyen MQTT 5 özelliklerinden biridir. MQTT 3.1.1'de her PUBLISH paketi, tam topic adını iki baytlık uzunluk önekine sahip bir UTF-8 string'i olarak taşır. ISA-95 tarzı yollar gibi iyi yapılandırılmış topic ağaçları açıklayıcıdır ama uzundur. connectmq/factory1/production/line1/cnc1/telemetry gibi bir yol 50 karakterdir ve payload'ınız zaman damgalı 20 baytlık bir sayıysa topic, verinin iki katından büyüktür.
MQTT 5 ile gönderen, bir PUBLISH'e Topic Alias property'si (tanımlayıcı 0x23, iki baytlık bir tamsayı) ekleyebilir. Bunu ilk kez yaptığında paket hem tam topic adını hem de alias'ı içerir ve alıcı eşlemeyi kaydeder. Sonraki PUBLISH paketleri sıfır uzunlukta bir topic adı ile alias'ı taşıyabilir ve alıcı saklanan topic'i yerine koyar.
Özelliği üç kural tanımlar:
- Alias'lar bağlantıya ve yöne özeldir. Client'tan broker'a eşleme ile broker'dan client'a eşleme birbirinden bağımsızdır. Alias'lar oturum durumunun parçası değildir ve oturum devam etse bile bağlantı kesildiğinde unutulur.
- Her taraf bir üst sınır belirler. Alıcı, Topic Alias Maximum property'si (
0x22) ile kaç alias kabul edeceğini bildirir. 0 değeri veya property'nin hiç olmaması, o yönde alias kabul edilmediği anlamına gelir. - Eşlemeler değiştirilebilir. Mevcut bir alias numarası ve boş olmayan bir topic adı ile PUBLISH göndermek, o alias'ı yeni topic'e yeniden bağlar.
Topic Alias Maximum Anlaşması Nasıl İşler?
Anlaşma CONNECT ve CONNACK paketlerinde gerçekleşir:
| Paket | Property | Anlamı |
|---|---|---|
| CONNECT (client'tan broker'a) | Topic Alias Maximum | Broker'ın bu client'a PUBLISH gönderirken kullanabileceği en yüksek alias |
| CONNACK (broker'dan client'a) | Topic Alias Maximum | Client'ın broker'a PUBLISH gönderirken kullanabileceği en yüksek alias |
| PUBLISH (her iki yönde) | Topic Alias | 1'den alıcının maksimumuna kadar alias numarası |
Yani broker'ın CONNACK'i 10 diyorsa, client'ınız giden publish'lerde 1'den 10'a kadar alias kullanabilir. CONNECT'iniz 0 diyorsa veya property'yi içermiyorsa, broker size her zaman tam topic adları gönderir. Alias 0 asla geçerli değildir.
Bir gönderen bu sınırları ihlal ederse, örneğin maksimum 10 iken alias 11'i kullanırsa veya hiç tanımlanmamış bir alias ile boş bir topic adı gönderirse, alıcı bağlantıyı 0x94 Topic Alias invalid reason code'u ile kapatır. MQTT reason code'ları referansı, bu kodu hata ayıklarken karşılaşmanız muhtemel diğer kodlarla birlikte listeler.
Bant Genişliği Tasarrufunu Hesaplamak
Tasarrufu tahmin etmek için bir laboratuvara ihtiyacınız yok; paket düzeni sabittir. Yukarıdaki 50 karakterlik topic ve 20 baytlık payload ile MQTT 5'te bir QoS 0 publish ele alalım:
| Alan | Tam topic | Alias ile ilk publish | Alias ile sonraki publish'ler |
|---|---|---|---|
| Sabit başlık (tür + kalan uzunluk) | 2 | 2 | 2 |
| Topic adı (2 bayt uzunluk + string) | 52 | 52 | 2 |
| Property uzunluğu | 1 | 1 | 1 |
| Topic Alias property'si (id + değer) | 0 | 3 | 3 |
| Payload | 20 | 20 | 20 |
| Toplam MQTT baytı | 75 | 78 | 28 |
İlk mesajdan sonra her publish 47 bayt küçülür; bu MQTT katmanında yaklaşık yüzde 63'lük bir azalmadır. İlk publish 3 bayt fazladan maliyet getirir ve bu, ikinci mesajda hemen geri kazanılır.
Büyük resmi aklınızda tutun. TCP ve IP başlıkları segment başına yaklaşık 40 bayt ekler ve TLS bunun üzerine kayıt yükü ekler. Dakikada bir mesaj gönderdiğiniz bir bağlantıda bu taşıma maliyetleri ve keep alive trafiği baskın gelir ve topic alias'lar faturayı neredeyse hiç değiştirmez. Saniyede çok sayıda küçük mesaj gönderen veya birkaç mesajı tek bir TCP segmentinde toplayan bir bağlantıda ise topic adı her baytın büyük bir payıdır ve alias'lar kendini amorti eder. MQTT bant genişliği kullanımı rehberi, TLS dahil mesaj başına tam hesabı adım adım anlatır.
Sayıları Wireshark ile doğrulayabilirsiniz: 1883 portunda yakalama yapın, mqtt görüntüleme filtresini uygulayın ve client'ınızdan gelen ilk ve ikinci PUBLISH'in Topic Length ve Msg Len alanlarını karşılaştırın.
MQTT.js ile Topic Alias Kullanmak
MQTT.js alias'ları hem manuel hem de otomatik olarak destekler. İşte mekanizmayı görünür kılan, herkese açık broker'a karşı manuel yaklaşım:
const mqtt = require("mqtt");
const TOPIC = "connectmq/demo/9c1e/factory1/production/line1/cnc1/telemetry";
const client = mqtt.connect("mqtts://broker.connectmq.com:8883", {
clientId: "alias-demo-9c1e",
protocolVersion: 5,
properties: {
topicAliasMaximum: 10, // broker'dan en fazla 10 alias kabul ediyoruz
},
});
client.on("connect", (connack) => {
const brokerMax = connack.properties?.topicAliasMaximum ?? 0;
console.log("Broker accepts topic aliases up to:", brokerMax);
if (brokerMax < 1) {
console.log("Aliases not available, publishing with full topic names");
}
let count = 0;
const timer = setInterval(() => {
const payload = JSON.stringify({ t: Date.now(), rpm: 1200 + count });
if (brokerMax < 1) {
client.publish(TOPIC, payload);
} else if (count === 0) {
// İlk publish: tam topic adı + alias eşlemeyi kurar
client.publish(TOPIC, payload, { properties: { topicAlias: 1 } });
} else {
// Sonraki publish'ler: boş topic adı, yalnızca alias
client.publish("", payload, { properties: { topicAlias: 1 } });
}
if (++count === 5) {
clearInterval(timer);
client.end();
}
}, 1000);
});
client.on("error", (err) => console.error("MQTT error:", err.message));
Broker'ın alias'ı çözümlediğini ve subscriber'lara tam topic'i teslim ettiğini doğrulamak için başka bir terminalden subscribe olun:
mosquitto_sub -h broker.connectmq.com -p 1883 -i alias-watch-9c1e \
-t "connectmq/demo/9c1e/#" -v -V mqttv5
Otomatik Alias Ataması
Gerçek uygulamalarda eşlemeyi kütüphanenin yönetmesine izin verin:
const client = mqtt.connect("mqtts://broker.connectmq.com:8883", {
clientId: "alias-auto-9c1e",
protocolVersion: 5,
autoAssignTopicAlias: true, // yeni topic'lere otomatik alias ata
autoUseTopicAlias: true, // topic tekrarlandığında mevcut alias'ı kullan
});
Bu seçeneklerle MQTT.js hangi topic'lerin zaten alias'ı olduğunu takip eder, broker'ın bildirdiği maksimumun içinde kalır ve alias'lar tükendiğinde tam topic adlarına geri döner. Kodunuzda normal topic string'leriyle publish etmeye devam edersiniz.
Tuzaklar ve En İyi Uygulamalar
Topic alias'lar basittir, ancak birkaç hata sorunların çoğuna yol açar:
- Yeniden bağlantıdan sonra alias'ları tekrar kullanmak. Eşlemeler TCP bağlantısı kapandığında kaybolur. Yeniden bağlantılar boyunca "alias 1 telemetri topic'imdir" bilgisini hatırlayan kod, tanımlanmamış bir alias gönderir ve
0x94ile bağlantıdan düşürülür. Her yeni bağlantıda önce tam topic'i yeniden gönderin. - CONNACK değerini yok saymak. Maksimumu asla koda gömmeyin. Broker'lar, planlar ve sürümler arasında farklılık gösterebileceği için her seferinde CONNACK'ten okuyun.
- Nadiren kullanılan topic'lere alias vermek. Alias'lar sık publish ettiğiniz topic'lere yardımcı olur. Günde bir kez publish ettiğiniz bir topic'e alias yuvası harcamak hiçbir şey kazandırmaz.
- Paketleri yeniden yazan ara katmanlar. Boş bir topic adı yalnızca alias property'siyle birlikte anlamlıdır. MQTT 5 property'lerini atan gateway'ler veya protokol çeviricileri bunu bozabilir; bu yüzden tüm ağ yolunu test edin.
- QoS ağırlıklı akışlarda tasarruf beklemek. QoS 1 ve 2, alias'ların küçültmediği onay paketleri ekler.
Bir filoda alias'ları etkinleştirmeden önce hızlı bir kontrol listesi:
- Client kütüphanesinin MQTT 5'i ve topic alias'ları desteklediğini doğrulayın.
- Bağlantı sırasında broker'ın Topic Alias Maximum değerini loglayın.
- Yeniden bağlanma handler'ınızda alias tablolarını sıfırlayın.
- Beklenen bayt tasarrufunu doğrulamak için birkaç paket yakalayın.
- Yaygınlaştırmadan sonra loglarda
0x94bağlantı kopmalarını izleyin.
ConnectMQ'da Topic Alias'lar
ConnectMQ, topic alias'lar dahil MQTT 5.0'ı session expiry, message expiry ve shared subscription'larla birlikte her uç noktada destekler. Bu, okunabilirlik için açıklayıcı, ISA-95 tarzı topic adlarını korurken kısıtlı cihazlardan yine de kompakt paketler gönderebileceğiniz anlamına gelir. Topic yapınızı hâlâ tasarlıyorsanız MQTT eğitimi iyi bir başlangıç noktasıdır; topic adlandırma kuralları rehberi ise bu adları tutarlı tutmanıza yardımcı olur.
Topic Alias'ları ConnectMQ'da Deneyin
Önce ücretsiz herkese açık MQTT broker'ında deneyin, ardından gerçek cihazlara hazır olduğunuzda TLS ve kendi kimlik bilgilerinizle özel bir tam yönetilen MQTT hizmetine geçin. Kredi kartı olmadan ücretsiz bir Serverless broker oluşturmak için app.connectmq.com adresinden kaydolun veya önce bulut MQTT broker seçme rehberini okuyun.
Sık Sorulan Sorular
MQTT topic alias MQTT 3.1.1'de kullanılabilir mi?
Hayır. Topic alias'lar MQTT 5.0 ile tanıtıldı ve 3.1.1'de bulunmayan bir PUBLISH property'si olarak taşınır. Hem client hem de broker MQTT 5 kullanmalıdır.
Topic alias'lar yeniden bağlantıdan sonra korunur mu?
Hayır. Alias'lar oturuma değil, ağ bağlantısına aittir. Herhangi bir yeniden bağlantıdan sonra gönderen, alias'ı kullanmadan önce tam topic adını yeniden publish etmelidir.
0x94 reason code'u ne anlama gelir?
Topic Alias invalid anlamına gelir: gönderen 0 değerinde, alıcının Topic Alias Maximum değerinin üzerinde veya eşleme tanımlanmadan önce boş bir topic adıyla bir alias kullanmıştır. Alias işleme mantığını düzeltin ve yeniden bağlanın.
Subscriber'lar alias'ı mı yoksa tam topic'i mi görür?
Subscriber'lar tam topic'i görür. Broker gelen taraftaki alias'ı çözümler ve giden taraftaki herhangi bir alias her subscriber ile ayrı ayrı belirlenir.



