Spesifikasyondaki MQTT mesaj boyutu sınırı paket başına yaklaşık 256 MB'tır; ancak asıl önemli olan sınır broker'ınızın, istemci kütüphanenizin ve cihazınızın belleğinin belirlediği sınırdır ve bu genellikle çok daha düşüktür. Bu rehber, bu sınırların her birini, bir mesaj çok büyük olduğunda ne olduğunu ve görüntü, log veya firmware gibi büyük payload'ları MQTT bağlantılarınızı bozmadan taşımak için üç stratejiyi açıklıyor.
Protokol Tavanı: 256 MB
MQTT, her paketin değişken başlığının ve payload'ının uzunluğunu, her biri yedi kullanılabilir bite sahip en fazla dört baytlık bir "remaining length" alanında kodlar. Bu alana sığabilecek en büyük değer 268.435.455 bayttır, yani kabaca 256 MB. Topic adını ve başlıkları çıkardığınızda teorik maksimum payload'a ulaşırsınız. Bu kodlama, MQTT paket yapısı rehberinde bayt bayt açıklanıyor.
Hiç kimse üretim sistemlerini bu tavana yakın çalıştırmaz. Herhangi bir istemciden 256 MB'lık mesajları kabul eden bir broker kolayca tüketilebilir: paketi tamponlaması, çevrimdışı oturumlar için veya retained değer olarak saklaması ve her subscriber'a kopyalaması gerekir. MQTT çok sayıda küçük mesaj için tasarlanmıştır ve gerçek bir kurulumun her katmanı bunu yansıtır.
Gerçek Sınırlar Nerede?
| Katman | Tipik sınır | Belirleyen |
|---|---|---|
| MQTT spesifikasyonu | Paket başına 268.435.455 bayt | Remaining length kodlaması |
| Broker | Yapılandırılmış maksimum mesaj veya paket boyutu | Broker yapılandırması veya plan |
| MQTT 5 müzakeresi | Maximum Packet Size özelliği | İstemci ve broker kabul ettikleri boyutu ayrı ayrı bildirir |
| İstemci kütüphanesi | Dahili tampon boyutu | Kütüphane varsayılanları, ör. Arduino PubSubClient'ta 256 bayt |
| Cihaz | Boş RAM | Bir mikrodenetleyicide yalnızca onlarca KB kullanılabilir olabilir |
| Ağ | Aktarım hızı ve kararlılık | Büyük mesajlar zayıf bağlantılarda daha uzun sürer ve daha sık başarısız olur |
Zincirdeki en küçük sınır geçerlidir. Bir ESP8266 subscriber'ı yalnızca birkaç kilobaytı tamponlayabiliyorsa, broker'ın 1 MB kabul etmesinin bir önemi yoktur. Arduino sınıfı donanımla çalışıyorsanız PubSubClient tampon boyutu rehberi bu özel tuzağı ele alıyor.
ConnectMQ'da MQTT Mesaj Boyutu Sınırları
Broker türüne göre güncel sınırlar şunlardır:
| Broker | Maksimum mesaj boyutu |
|---|---|
| Herkese açık test broker'ı (broker.connectmq.com) | 64 KB |
| Serverless (Free) planı | 256 KB |
| Serverless (Paid) planı | 1 MB |
| Dedicated, BYOC ve Self Managed Enterprise | Kuruluma bağlıdır |
Çoğu telemetri, alarm ve komut için 64 KB bile fazlasıyla yeterlidir: bir JSON sensör ölçümü genellikle 1 KB'ın çok altındadır. Bu sınırlara düzenli olarak yaklaşıyorsanız bu, genellikle payload'ın aşağıda açıklandığı gibi başka bir yere ait olduğunun işaretidir.
MQTT 5 Maximum Packet Size
MQTT 5, Maximum Packet Size özelliğiyle (0x27) boyut sınırlarını açık hale getirdi:
- CONNECT içinde istemci, almaya hazır olduğu en büyük paketi broker'a bildirir. Broker bundan büyük bir şey göndermemelidir; bunun yerine bu tür mesajları o istemci için atar.
- CONNACK içinde broker, kabul ettiği en büyük paketi istemciye bildirir. Daha büyüğünü gönderen bir istemci protokolü ihlal eder.
Bunun yalnızca payload'ın değil, sabit başlık, topic ve özellikler dahil tüm paketin boyutu olduğunu unutmayın. Biraz pay bırakın.
MQTT.js'te broker'ın sınırını okumak:
const mqtt = require("mqtt");
const client = mqtt.connect("mqtts://broker.connectmq.com:8883", {
clientId: "size-check-8b4d",
protocolVersion: 5,
properties: { maximumPacketSize: 64 * 1024 }, // bu istemcinin kabul ettiği boyut
});
client.on("connect", (connack) => {
const max = connack.properties?.maximumPacketSize;
console.log("Broker maximum packet size:", max ?? "not announced");
client.end();
});
Özellik yoksa broker CONNACK'te bir sınır bildirmemiştir, ancak yine de bir sınır uyguluyor olabilir. Broker'ınızın belgelenmiş sınırını her zaman bilin.
Bir Mesaj Çok Büyük Olduğunda Ne Olur?
Davranış, protokol sürümüne ve yöne bağlıdır:
- İstemciden broker'a, MQTT 5. Broker genellikle istemcinin bağlantısını
0x95 Packet too largereason code'u ile keser. - İstemciden broker'a, MQTT 3.1.1. Reason code yoktur; broker bağlantıyı kapatır. İstemci genel bir bağlantı kaybı görür.
- Broker'dan istemciye. Bir subscriber daha küçük bir Maximum Packet Size bildirdiyse broker mesajı o subscriber için atar. 3.1.1'de subscriber'ın kütüphanesi mesajı ayrıştıramayabilir veya bağlantıyı kesebilir.
- İstemcinin içinde. Bazı kütüphaneler göndermeyi reddeder ve hata döndürür; Arduino PubSubClient ise
publish()çağrısından yalnızcafalsedöndürür.
Tehlikeli senaryo, aşırı büyük mesajı kuyruğa alan, yeniden bağlanan ve hemen tekrar deneyen bir istemcidir. Sonuç bir bağlantı kopma döngüsüdür; bu, MQTT istemcisinin sürekli bağlantısının kopmasının klasik nedenlerinden biridir. Publish etmeden önce boyutu doğrulayın ve çok büyük mesajları atın veya başka bir yola yönlendirin.
Büyük Payload'lar için Stratejiler
1. Payload'ı Küçültün
Herhangi bir şeyi bölmeden önce küçültün. JSON'daki alan adları her mesajda tekrarlanır; kısa anahtarlar, CBOR veya Protobuf gibi ikili kodlamalar ve gzip sıkıştırması payload'ları çoğu zaman ciddi ölçüde küçültür. Tüm durum yerine yalnızca değişen değerleri göndermek de yardımcı olur. MQTT payload formatı rehberi bu seçenekleri karşılaştırıyor.
2. Mesajı Parçalara Bölün
Bir payload orta büyüklükteyse, örneğin birkaç yüz kilobaytlık log verisiyse, onu numaralandırılmış parçalara bölüp alıcı tarafta yeniden birleştirebilirsiniz. Bu Python publisher'ı bir dosyayı, her parça için küçük bir JSON başlığıyla 32 KB'lık parçalara böler:
import base64, hashlib, json, math, time, uuid
import paho.mqtt.client as mqtt
CHUNK = 32 * 1024
TOPIC = "connectmq/demo/8b4d/files"
def send_file(client, path):
data = open(path, "rb").read()
transfer_id = uuid.uuid4().hex[:8]
total = math.ceil(len(data) / CHUNK)
sha = hashlib.sha256(data).hexdigest()
for i in range(total):
part = data[i * CHUNK:(i + 1) * CHUNK]
msg = {"id": transfer_id, "seq": i, "total": total, "sha256": sha,
"data": base64.b64encode(part).decode()}
client.publish(f"{TOPIC}/{transfer_id}", json.dumps(msg), qos=1).wait_for_publish()
time.sleep(0.15) # istemci başına hız sınırlarına uyun
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="chunker-8b4d")
client.connect("broker.connectmq.com", 1883, keepalive=60)
client.loop_start()
send_file(client, "report.csv")
client.loop_stop()
client.disconnect()
Base64 boyutu yaklaşık üçte bir oranında artırır; bu nedenle 32 KB'lık ikili veri ağ üzerinde kabaca 43 KB olur ve herkese açık broker'ın 64 KB sınırının rahatça altında kalır. Subscriber parçaları id değerine göre toplar, seq değerine göre sıralar ve total sayısındaki tüm parçalar geldiğinde SHA-256 değerini doğrular. Parçaların sessizce kaybolmaması için QoS 1 kullanın ve tekrarlanan veya eksik parçalar için bir zaman aşımıyla tasarım yapın. Herkese açık broker'da saniyede 10 mesaj sınırını aklınızda tutun; koddaki sleep bunu sağlar.
Parçalama karmaşıklık ekler; bu yüzden onu tek bir mesaja sığmayacak kadar büyük, ancak MQTT'nin hâlâ doğru taşıma yöntemi olacağı kadar küçük payload'lar için saklayın.
3. Dosyayı Bant Dışında Gönderin
Görüntüler, video, firmware imajları ve büyük dışa aktarımlar için en sağlam yöntem, baytları MQTT'nin tamamen dışında tutmaktır. Dosyayı HTTPS üzerinden nesne depolamaya veya bir web sunucusuna yükleyin, ardından ona işaret eden küçük bir MQTT mesajı publish edin:
{
"type": "firmware",
"version": "2.4.1",
"url": "https://files.example.com/fw/sensor-2.4.1.bin",
"sha256": "9f2c...e81a",
"size": 1048576
}
Cihazlar dosyayı HTTP range istekleri ve kaldığı yerden devam desteğiyle indirir, hash'i doğrular ve ilerlemeyi MQTT üzerinden geri bildirir. Böylece MQTT'nin güçlü yanlarını, yani anlık bildirimi ve çok sayıda cihaza dağıtımı korurken toplu aktarımı HTTP ve depolama servisleri üstlenir.
Boyut Kararı Kontrol Listesi
- 10 KB altı: tek mesaj olarak gönderin, özel bir işlem gerekmez.
- 10 KB ile broker'ınızın sınırı arası: sıkıştırın veya kompakt bir kodlama kullanın ve her subscriber'ın bunu tamponlayabildiğini doğrulayın.
- Sınırın üzerinde ama yalnızca ara sıra: sıra numaraları ve sağlama toplamlarıyla parçalara bölün.
- Büyük ikili dosyalar veya düzenli toplu aktarımlar: bant dışında yükleyin ve bir referans publish edin.
- Her durumda: publish çağırmadan önce boyutu kodda kontrol edin.
ConnectMQ ile Mesaj Gönderin
ConnectMQ, ücretsiz Serverless planında 256 KB'lık mesajlardan ücretli Serverless planında 1 MB'a kadar açık, plana dayalı sınırlar sunar; daha büyük kurulumlar için Dedicated, BYOC ve Self Managed Enterprise seçenekleri de mevcuttur. Önce ücretsiz herkese açık MQTT broker üzerinde deneme yapın, ardından özel kimlik bilgilerine ve daha yüksek sınırlara ihtiyaç duyduğunuzda tamamen yönetilen bir MQTT servisine geçin. Yeni başlıyorsanız MQTT eğitimi temelleri ele alıyor.
ConnectMQ ile Başlayın
app.connectmq.com adresinde kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun ve dakikalar içinde kullanıcı adı, parola ve client ID edinin. Barındırma seçeneklerini karşılaştırmak için bulut MQTT broker seçme rehberimizi okuyun.
Sık Sorulan Sorular
Maksimum MQTT mesaj boyutu nedir?
Protokol 268.435.455 bayta, yani yaklaşık 256 MB'a kadar paketlere izin verir. Pratikte broker'lar çok daha düşük sınırlar belirler; ConnectMQ'da bu sınır herkese açık broker'da 64 KB, ücretsiz planda 256 KB ve ücretli Serverless planında 1 MB'tır.
Çok büyük bir mesaj publish edersem ne olur?
Broker mesajı reddeder ve genellikle bağlantıyı kapatır. MQTT 5 istemcileri 0x95 Packet too large reason code'unu alırken MQTT 3.1.1 istemcileri yalnızca bağlantının koptuğunu görür.
MQTT üzerinden dosya göndermeli miyim?
Küçük dosyalar doğrudan veya parçalar halinde gönderilebilir. Büyük dosyaları HTTPS üzerinden depolamaya yükleyin ve URL ile sağlama toplamını içeren küçük bir MQTT mesajı publish edin.
Boyut sınırına topic adı dahil midir?
Broker sınırları genellikle mesaj başına veya paket başına ifade edilir ve MQTT 5 Maximum Packet Size, topic ve özellikler dahil tüm paketi sayar. Payload boyutunuzun üzerinde pay bırakın.



