MQTT session expiry interval, broker'a bir istemcinin oturumunu bağlantısı kesildikten sonra ne kadar süre saklayacağını söyler ve Clean Start bayrağıyla birlikte MQTT 3.1.1'deki ya hep ya hiç mantığıyla çalışan clean session bayrağının yerini alır. Bu yazıda iki ayarın nasıl birleştiğini, sürenin bağlantı kesilirken nasıl değiştirilebileceğini ve sensörler, gateway'ler ve backend servisleri için makul değerlerin nasıl seçileceğini öğreneceksiniz.
MQTT 5 Clean Session Bayrağının Yerine Neden Başka Bir Şey Getirdi?
MQTT 3.1.1'de cleanSession tek bir bitle iki iş görüyordu. Bu değeri false yapmak "eski oturumumu sürdür ve bu oturumu sonsuza kadar sakla" anlamına geliyordu. "Oturumumu sürdür ama bir saatten uzun süre yoksam onu unut" demenin bir yolu yoktu. Broker'lar bu durumu sunucu tarafı sona erme ayarlarıyla aşmaya çalıştı; bu da davranışın broker'dan broker'a farklılık göstermesine ve terk edilmiş oturumların birikmesine yol açtı.
MQTT 5 bu iki konuyu birbirinden ayırır:
- Clean Start (bir CONNECT bayrağı) şu soruyu yanıtlar: broker mevcut bir oturumu şu anda atmalı mı?
- Session Expiry Interval (saniye cinsinden bir CONNECT özelliği) şu soruyu yanıtlar: ağ bağlantısı kapandıktan sonra oturum ne kadar süre yaşamalı?
Bu tasarım OASIS MQTT 5.0 spesifikasyonunda açıklanır ve MQTT 5 özellikleri genel bakışımızda ele aldığımız en pratik iyileştirmelerden biridir.
Clean Start ve Session Expiry Nasıl Birleşir?
| Clean Start | Session Expiry Interval | Davranış | 3.1.1 karşılığı |
|---|---|---|---|
| true | 0 (veya yok) | Yeni oturum, bağlantı kesildiğinde silinir | cleanSession = true |
| false | 0 (veya yok) | Varsa mevcut oturumu sürdürür, bağlantı kesildiğinde silinir | Doğrudan karşılığı yok |
| true | > 0 | Eski oturumu atar, bağlantı kesildikten sonra N saniye yaşayan yeni bir oturum başlatır | Doğrudan karşılığı yok |
| false | > 0 | Varsa sürdürür, bağlantı kesildikten sonra N saniye yaşar | cleanSession = false (zaman aşımıyla) |
| false | 0xFFFFFFFF | Varsa sürdürür, hiçbir zaman sona ermez | cleanSession = false |
Pratikte birkaç ayrıntı önemlidir:
- Zamanlayıcı, istemcinin son publish yaptığı anda değil, ağ bağlantısı kapandığında başlar.
- İstemci zamanlayıcı dolmadan yeniden bağlanırsa oturum sürdürülür ve zamanlayıcı iptal edilir.
- Süre dolduğunda broker abonelikleri ve kuyruktaki tüm mesajları siler.
- Oturumun süresi dolarsa, will gecikme süresi daha uzun olsa bile will mesajı en geç o anda gönderilir.
Süreyi Bağlantı Kesilirken Değiştirmek
MQTT 5, bir istemcinin DISCONNECT paketinde sona erme süresini güncellemesine izin verir. Planlı bakıma giren bir cihaz, normalde daha kısa bir değerle çalışırken ayrılırken "oturumumu bir gün sakla" diyebilir. Tek bir kısıtlama vardır: istemci 0 süresiyle bağlandıysa bağlantıyı keserken sıfır olmayan bir değer ayarlayamaz; broker bunu protokol hatası olarak değerlendirir.
Broker Talebinizi Geçersiz Kılabilir
Bir broker, oturumları istediğiniz kadar uzun süre saklamayı reddedebilir. Bu durumda CONNACK içinde bir Session Expiry Interval özelliği döndürür ve geçerli olan değer budur. Gerçek sayıyı bilmek için geliştirme sırasında CONNACK özelliklerini her zaman loglayın. broker.connectmq.com adresindeki ücretsiz test broker'ında session expiry 30 dakikayla sınırlıdır.
MQTT Session Expiry Interval Değerini Seçmek
İki soruyu düşünün: bu istemci gerçekçi olarak ne kadar süre çevrimdışı kalabilir ve kuyruktaki bir mesaj işe yaramaz hale gelmeden ne kadar eskiyebilir?
| İstemci türü | Önerilen süre | Gerekçe |
|---|---|---|
| Canlı dashboard, tarayıcı sekmesi | 0 | Yalnızca güncel veri önemlidir; retained mesajlar bağlantıda ekranı doldurur |
| Yalnızca publish eden şebeke beslemeli sensör | 0 ila 300 sn | Oturum durumu azdır; kısa süre hızlıca temizlik yapar |
| Komut alan cihaz | 1 ila 24 saat | Komutlar Wi-Fi kopmalarından ve kısa kesintilerden sağ çıkmalıdır |
| Saatte bir uyanan uykucu pilli cihaz | Uyanma aralığından biraz uzun | Oturum uyku süresinden daha uzun yaşamalıdır |
| Alarm işleyen backend worker'ı | Kurtarma sürenize göre saatler | Kaçırılan alarmlar yeniden dağıtımlardan sonra işlenmelidir |
| Hizmetten çıkarılmış veya test istemcisi | 0 | Geride sahipsiz oturum bırakmaktan kaçının |
Uzun sona erme sürelerini, zamana duyarlı yayınlarda MQTT 5 Message Expiry Interval özelliğiyle eşleştirin. Altı saat boyunca kuyrukta bekleyen bir "pompayı çalıştır" komutu, hiç teslim edilmeyen bir komuttan daha tehlikeli olabilir.
Uygulamalı Bir Örnek: Komut Alan Uykucu Sensör
Her 15 dakikada bir uyanan, bir ölçüm publish eden, yapılandırma komutlarını kontrol eden ve yeniden uykuya geçen pilli bir sensör düşünün. Session expiry 0 olsaydı, uyurken gönderilen her komut düşerdi; çünkü onu kuyruğa alacak bir oturum olmazdı. Süre sonsuz olsaydı, sahada ölen bir sensör kimsenin okumayacağı komutları toplamaya devam eden bir oturum bırakırdı. Yaklaşık 20 ila 30 dakikalık bir değer, kaçırılmış bir uyanmayı ve biraz ağ dalgalanmasını karşılar; cihaz gerçekten devre dışı kaldığında da oturum kendiliğinden ortadan kalkar. Komutları QoS 1 ve birkaç saatlik bir message expiry ile gönderin; cihaz bir sonraki bağlantısında hâlâ geçerli olan her şeyi alır.
Session Expiry'yi Kodda Ayarlamak
Tüm örnekler ücretsiz herkese açık MQTT broker üzerinde benzersiz bir demo öneki kullanır. s4e8 değerini kendi rastgele dizenizle değiştirin; herkese açık alan herkes tarafından görülebilir.
mosquitto_sub
# Bağlantı kesildikten sonra 10 dakika yaşayan bir oturumu sürdür (veya oluştur)
mosquitto_sub -h broker.connectmq.com -p 1883 -V mqttv5 \
-i expiry-demo-s4e8 -c -x 600 -q 1 -v -d \
-t 'connectmq/demo/s4e8/commands/#'
-c, Clean Start'ı false yapar; -x 600 ise Session Expiry Interval değerini ayarlar. -d bayrağı CONNACK'i yazdırır; böylece broker'ın değeri kabul edip etmediğini görebilirsiniz.
Python (paho-mqtt 2.x)
import paho.mqtt.client as mqtt
from paho.mqtt.properties import Properties
from paho.mqtt.packettypes import PacketTypes
def on_connect(client, userdata, flags, reason_code, properties):
granted = getattr(properties, "SessionExpiryInterval", None)
print("Connected:", reason_code,
"| session present:", flags.session_present,
"| broker override:", granted)
if not flags.session_present:
client.subscribe("connectmq/demo/s4e8/commands/#", qos=1)
def on_message(client, userdata, msg):
print("Command:", msg.topic, msg.payload.decode())
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,
client_id="expiry-py-s4e8",
protocol=mqtt.MQTTv5)
client.on_connect = on_connect
client.on_message = on_message
connect_props = Properties(PacketTypes.CONNECT)
connect_props.SessionExpiryInterval = 600
client.connect("broker.connectmq.com", 1883, keepalive=60,
clean_start=False, properties=connect_props)
client.loop_start()
try:
input("Press Enter to disconnect with a 30 minute expiry...\n")
finally:
bye = Properties(PacketTypes.DISCONNECT)
bye.SessionExpiryInterval = 1800
client.disconnect(properties=bye)
client.loop_stop()
Node.js (MQTT.js v5)
const mqtt = require("mqtt");
const client = mqtt.connect("mqtts://broker.connectmq.com:8883", {
clientId: "expiry-node-s4e8",
protocolVersion: 5,
clean: false, // Clean Start = false
properties: { sessionExpiryInterval: 600 },
});
client.on("connect", (connack) => {
console.log("session present:", connack.sessionPresent,
"props:", connack.properties);
if (!connack.sessionPresent) {
client.subscribe("connectmq/demo/s4e8/commands/#", { qos: 1 });
}
});
client.on("message", (topic, payload) => {
console.log(topic, payload.toString());
});
Yaygın Hatalar ve Nasıl Fark Edilecekleri
- Clean Start false, süre 0. Geliştiriciler 3.1.1 kodunu taşır,
clean: falseayarlar ve süre özelliğini unutur. MQTT 5'te bu oturum bağlantı koptuğu anda silinir; dolayısıyla hiçbir şey kuyruğa alınmaz. Kuyruktaki mesajlar hiç görünmüyorsa önce bunu kontrol edin. - Test istemcilerinde sonsuz süre. Benzersiz bir kimlik ve
0xFFFFFFFFkullanan her tek kullanımlık betik geride bir oturum bırakır. Oturumları test etmiyorsanız deneylerde 0 kullanın. - Session Present'ı görmezden gelmek. Broker yeniden başladıysa veya oturumun süresi dolduysa Session Present 0'dır ve abonelikleriniz gitmiştir. Bu durumda her zaman yeniden abone olun.
- Broker yeniden başlatmalarında kalıcılık varsaymak. Session expiry, bir oturumun ne kadar süre yaşayabileceğini ifade eder; bir depolama garantisi değildir. ConnectMQ oturum durumunu bellekte tutar: istemci bağlantı kesilmelerinden tanınan süre boyunca sağ çıkar, ancak broker'ın kendisi yeniden başlarsa temizlenir.
- Client ID'leri değiştirmek. Süre client ID'ye bağlıdır. Yeni bir kimlik yeni bir oturumdur; bkz. MQTT client ID en iyi uygulamaları.
Büyük Resimdeki Yeri
Session expiry, kalıcı oturumları güvenle çalıştırmanın MQTT 5 yoludur: ihtiyaç duyduğunuz yerde çevrimdışı kuyruklama, ihtiyaç duymadığınız yerde otomatik temizlik elde edersiniz. Protokolün hareketli parçalarını hâlâ öğreniyorsanız kapsamlı MQTT eğitimi iyi bir tamamlayıcı okumadır.
ConnectMQ'da MQTT 5 Oturumlarını Kullanın
ConnectMQ; session expiry, message expiry, topic alias'lar ve reason code'lar dahil tam MQTT 5.0 desteğine sahip yönetilen bir MQTT broker'dır. Clean Start ve süre kombinasyonlarını portalın tarayıcı içi MQTT istemcisiyle veya kendi kodunuzla test edebilir, ardından aynı ayarları üretime taşıyabilirsiniz. Kredi kartı gerektirmeden ücretsiz Serverless planıyla başlayın ve oluşturulan YOUR_USERNAME, YOUR_PASSWORD ve YOUR_CLIENT_ID bilgileriyle bağlanın.
Sık Sorulan Sorular
Varsayılan MQTT session expiry interval nedir?
Özellik yoksa session expiry interval 0'dır; bu da oturumun ağ bağlantısı kapandığında sona erdiği anlamına gelir. MQTT 5'te kalıcı bir oturum elde etmek için bu değeri açıkça ayarlamanız gerekir.
Clean Start ile clean session arasındaki fark nedir?
MQTT 3.1.1'deki clean session hem eski oturumun atılmasını hem de yeni oturumun saklanmasını kontrol ediyordu. MQTT 5'teki Clean Start yalnızca bağlantı anında atmayı kontrol ederken, Session Expiry Interval oturumun sonrasında ne kadar süre yaşayacağını kontrol eder.
Maksimum session expiry interval nedir?
Protokol maksimumu 4.294.967.295 saniyedir (0xFFFFFFFF) ve bu, oturumun hiçbir zaman sona ermediği anlamına gelir. Broker'lar daha düşük sınırlar uygulayabilir ve bunları CONNACK içinde bildirebilir; ConnectMQ herkese açık test broker'ı 30 dakikaya kadar izin verir.
Bağlantıyı keserken session expiry'yi değiştirebilir miyim?
Evet; başlangıçta 0 süresiyle bağlanmadıysanız DISCONNECT içinde bir Session Expiry Interval özelliği göndererek değiştirebilirsiniz.



