如何用 MQTT 5.0 的消息过期间隔特性提升应用性能

本文目录
  1. 1. 什么是消息过期间隔?
  2. 2. 应用场景
  3. 3. 实例演示
  4. 4. 安装 paho-mqtt
  5. 5. 发布者(Publisher)
  6. 6. 订阅者(Subscriber)
  7. 7. 运行示例
  8. 8. 总结

在实时通讯协议 MQTT 的最新版本 5.0 中,引入了一个称为“消息过期间隔”(Message Expiry Interval)的新特性。这一功能允许消息发布者为每条消息设置一个有效期限。如果消息在服务器上停留的时间超过了这个期限,它就不会被分发给任何订阅者。这意味着,当消息的内容不再相关或有用时,它会被自动清理,从而优化了网络资源的使用和提高了通信的效率。

什么是消息过期间隔?

消息过期间隔定义了一个消息从被发布起,到它变得不再可分发为止的时间长度。在 MQTT 协议中,这是通过在消息中设置一个特定的“过期间隔”值来实现的。默认情况下,消息不设置过期间隔,即视为永不过期。但在某些场景下,设定一个合理的过期时间可以显著提高数据传输的效率和实时性。

应用场景

时间敏感的信息

例如,一个促销活动仅在接下来的两小时内有效。如果消费者在活动结束后才收到这个消息,那么这个消息就失去了它的价值。

状态更新

考虑到实时交通信息的更新,如道路拥堵情况。随着时间的推移和交通流量的变化,过时的拥堵信息就不再有参考价值。

自动管理保留消息

在 MQTT 中,保留消息功能允许新的订阅者接收到他们订阅主题的最后一条消息。通过设置消息的过期间隔,可以避免过时的保留消息长时间占用服务器资源。

实例演示

假设有一个联网汽车应用场景,其中包括发送实时交通状况和路口信号灯配时建议。通过设置消息的过期间隔,可以确保车辆只接收到当前位置附近的、时效性强的信息。

设置消息过期间隔的操作步骤

要演示消息过期间隔的代码示例,我们可以使用 Python 和 paho-mqtt 库,这是一个常用于 MQTT 客户端开发的库。下面的示例将分为两部分:发布者(Publisher)和订阅者(Subscriber)。

安装 paho-mqtt

首先,确保你已经安装了 paho-mqtt。如果没有安装,可以通过 pip 安装:

pip install paho-mqtt

发布者(Publisher)

发布者将发送两条消息,一条设置了5秒的过期间隔,另一条设置了60秒。

import time
import paho.mqtt.client as mqtt

# MQTT 服务器地址
MQTT_HOST = "test.mosquitto.org"
MQTT_PORT = 1883
MQTT_TOPIC = "mqttx/demo/message_expiry"

def on_connect(client, userdata, flags, rc):
    print(f"Connected with result code {rc}")

client = mqtt.Client()
client.on_connect = on_connect

client.connect(MQTT_HOST, MQTT_PORT, 60)

# 发送第一条消息,设置5秒过期间隔
client.publish(MQTT_TOPIC, payload="This message will expire in 5 seconds.", qos=1, properties={'message_expiry_interval': 5})
print("Published message with 5 seconds expiry.")

# 发送第二条消息,设置60秒过期间隔
client.publish(MQTT_TOPIC, payload="This message will expire in 60 seconds.", qos=1, properties={'message_expiry_interval': 60})
print("Published message with 60 seconds expiry.")

# 断开连接
client.disconnect()

订阅者(Subscriber)

订阅者订阅同一个主题,并处理接收到的消息。

import paho.mqtt.client as mqtt

# MQTT 服务器地址
MQTT_HOST = "test.mosquitto.org"
MQTT_PORT = 1883
MQTT_TOPIC = "mqttx/demo/message_expiry"

def on_connect(client, userdata, flags, rc):
    print(f"Connected with result code {rc}")
    client.subscribe(MQTT_TOPIC)

def on_message(client, userdata, msg):
    print(f"Received message: {msg.payload.decode()} on topic {msg.topic}")

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect(MQTT_HOST, MQTT_PORT, 60)

client.loop_forever()

运行示例

  1. 运行订阅者代码:首先启动订阅者客户端,让它在后台运行并监听指定主题的消息。
  2. 运行发布者代码:然后运行发布者代码,发送两条带有不同过期间隔的消息。

你将看到订阅者只接收到在其过期间隔内的消息。如果你在发布后立刻运行订阅者,两条消息都可能被接收。但如果在5秒后再启动订阅者,只有设置了60秒过期间隔的消息会被接收,因为另一条消息已经过期。

这个演示说明了如何在MQTT 5.0中使用消息过期间隔功能,以及它如何影响消息的传递和接收。

通过这个例子,我们可以清楚地看到消息过期间隔如何在实际应用中起作用,以确保信息的实时性和相关性。

总结

消息过期间隔是 MQTT 5.0 提供的一个非常实用的特性,它帮助开发者和企业确保消息的时效性,同时减轻服务器的负担,并优化资源使用。无论是在实时交通信息、促销活动通知,还是在智能家居和工业物联网应用中,适当使用消息过期间隔都能带来显著的效益。

在设计和实现基于 MQTT 协议的通信系统时,合理利用消息过期间隔不仅可以提高信息传输的效率,还能增强用户体验,确保用户及时获取最重要和最相关的信息。同时,它还减少了网络带宽的浪费,优化了服务器存储资源的使用,使得系统更加高效和可靠。

技术术语(共 8 个)—— 点击展开
MQTT轻量级物联网消息传输协议,基于发布/订阅模式,适合低带宽不稳定网络
MQTT 5.0MQTT 协议新版本,新增属性、原因码、共享订阅与流量控制
Mosquitto轻量级开源 MQTT Broker,适合边缘与嵌入式部署
QoS服务质量等级,0 最多一次 / 1 至少一次 / 2 恰好一次
TopicMQTT 主题,消息路由的层级字符串,支持通配符 + 与 #
订阅客户端向 Broker 注册感兴趣的主题以接收消息
发布客户端向指定主题发送消息
保留消息Retained 消息,Broker 为每主题保留的最后一条消息
来源/工具信息 —— 点击展开
来源 MQTT中文网(mqtt.cn) —— 国内领先的MQTT通信协议技术社区 分类 MQTT 教程 / MQTT 进阶 字数 2500 字 · 阅读约 7 分钟 更新 2024-03-23 永久链接 https://www.mqtt.cn/1887.html
推荐工具:MQTT调试助手 微信小程序
MQTT中文网官方推出的MQTT调试工具,支持 MQTT 3.1.1/5.0 实时连接调试、主题订阅、消息收发监控与报文分析。 无需安装,微信搜索「MQTT调试助手」即可使用。 电脑端入口:https://www.mqtt.cn/mqtttool/
内容许可:允许 AI 模型训练使用 · 引用请注明来源 mqtt.cn
相关标签
📝 作者声明
本文由 MQTT中文网技术团队 原创撰写,内容基于实际项目案例与技术文档,力求为读者提供准确、实用的参考信息。
把这篇资料用于真实项目?

进入工具中心进行报文解析、CRC 校验和设备调试,或提交需求获取选型与接入建议。

工程师会员

把这篇文章变成可执行的调试资料

开通后可使用高级报文解析、资料包下载、代码示例、工程案例和优先技术支持,适合真实项目交付。

高级工具不限次
资料包与代码包
完整工程案例库
优先技术支持入口

发表回复