主题名称中的 mqtt 时间戳:反模式?
mqtt timestamp in the topic name: anti-pattern?
mqtt 社区会考虑将消息信息放在主题名称中作为反模式吗?
我有一个客户端,它有一个围绕 rabbitmq 编写的庞大库,我正在尝试调整他们的客户端和服务器代码,以允许他们为 mosquitto 配置他们的服务。他们的一个核心要求是 TTL,客户端有时会在服务器恢复在线之前等待数小时发布数据,并且他们不希望显示超出其 TTL 的消息。
他们的消息信封系统是一个精心设计的 json 并且 1) 包装或更改它会很痛苦 json 2) 我不想承担解组的费用 json 检索时间戳。
最简单的做法是将时间戳放在主题的末尾并使用通配符使用:mytopic/mysubtopic/{timestamp} consumed by mytopic/mysubtopic/#
这是否会产生任何意想不到的后果,这会被视为反模式吗?
这是否是 anti-pattern 见仁见智; spec 将主题定义为“附加到应用程序消息的标签...”,因此不排除您的使用。我可以想到您的方法的一些潜在“意外后果”(可能适用于您的具体情况,也可能不适用):
- 保留标志:根据您的评论,您将无法将
Retain
标志设置为 1(因为将保留所有消息)。
- 仅当通讯 re-established 时才显示最新消息:当通讯 re-established 时,订阅者可能只需要最新消息。这可以通过发布消息并将
retain
标志设置为 1 来实现,这会导致您的订阅者在其订阅的每个主题上收到最新消息(并且仅接收最新消息;受 QOS/CleanSession 约束)(docs).根据上述,这不适用于您的主题结构。
- 交付顺序:spec 要求“服务器必须默认将每个主题视为一个 'Ordered Topic'”,但跨主题没有这样的保证。请注意,有序交付取决于设置(请参阅规范中的“非规范性评论”),因此这可能不是问题。
- 主题别名:MQTT V5 引入了Topic Alias,可用于减少传输的数据量。这不会为您的结构带来好处。
mqtt 社区会考虑将消息信息放在主题名称中作为反模式吗?
我有一个客户端,它有一个围绕 rabbitmq 编写的庞大库,我正在尝试调整他们的客户端和服务器代码,以允许他们为 mosquitto 配置他们的服务。他们的一个核心要求是 TTL,客户端有时会在服务器恢复在线之前等待数小时发布数据,并且他们不希望显示超出其 TTL 的消息。
他们的消息信封系统是一个精心设计的 json 并且 1) 包装或更改它会很痛苦 json 2) 我不想承担解组的费用 json 检索时间戳。
最简单的做法是将时间戳放在主题的末尾并使用通配符使用:mytopic/mysubtopic/{timestamp} consumed by mytopic/mysubtopic/#
这是否会产生任何意想不到的后果,这会被视为反模式吗?
这是否是 anti-pattern 见仁见智; spec 将主题定义为“附加到应用程序消息的标签...”,因此不排除您的使用。我可以想到您的方法的一些潜在“意外后果”(可能适用于您的具体情况,也可能不适用):
- 保留标志:根据您的评论,您将无法将
Retain
标志设置为 1(因为将保留所有消息)。 - 仅当通讯 re-established 时才显示最新消息:当通讯 re-established 时,订阅者可能只需要最新消息。这可以通过发布消息并将
retain
标志设置为 1 来实现,这会导致您的订阅者在其订阅的每个主题上收到最新消息(并且仅接收最新消息;受 QOS/CleanSession 约束)(docs).根据上述,这不适用于您的主题结构。 - 交付顺序:spec 要求“服务器必须默认将每个主题视为一个 'Ordered Topic'”,但跨主题没有这样的保证。请注意,有序交付取决于设置(请参阅规范中的“非规范性评论”),因此这可能不是问题。
- 主题别名:MQTT V5 引入了Topic Alias,可用于减少传输的数据量。这不会为您的结构带来好处。