MQTT v5共享订阅是怎么回事?如何使用共享订阅提高消息订阅的灵活性和可伸缩性?

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
网络型负载均衡 NLB,每月750个小时 15LCU
简介: MQTT v5共享订阅是怎么回事?如何使用共享订阅提高消息订阅的灵活性和可伸缩性?

MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,被广泛应用于物联网和传感器网络中。MQTT版本5(MQTT v5)是MQTT协议的最新版本,引入了一些新的特性和改进。本文将详细介绍MQTT v5中的共享订阅功能,探讨如何使用共享订阅提高消息订阅的灵活性和可伸缩性。

MQTT共享订阅概述

在传统的MQTT订阅模型中,每个订阅者(Subscriber)都会接收到发布者(Publisher)发送的所有消息。然而,有时候我们希望多个订阅者之间共享订阅,即将订阅者分组,并且每个组中只有一个订阅者接收到消息。这种模式被称为共享订阅(Shared Subscription)。

MQTT v5引入了共享订阅功能,通过共享订阅,我们可以更灵活地管理消息订阅,减轻订阅者的负担,并提高整个系统的可伸缩性。

共享订阅的优势

共享订阅具有以下几个优势:

  1. 负载均衡和扩展性:通过将订阅者分组,并且每个组中只有一个订阅者接收消息,共享订阅可以实现负载均衡,使得系统能够更好地处理大规模的消息流量。

  2. 高可用性:共享订阅允许多个订阅者同时连接到同一个共享订阅,当一个订阅者断开连接或不可用时,其他订阅者可以继续接收消息,提高了系统的可用性。

  3. 消息过滤和分发:共享订阅允许订阅者使用消息过滤器,只接收感兴趣的消息,这样可以减少不必要的网络流量,并提高消息传输的效率。

  4. 动态添加和移除订阅者:在共享订阅中,可以动态地添加或移除订阅者,而不会影响其他订阅者的消息接收。这种灵活性使得系统更易于扩展和管理。

共享订阅的实现

在MQTT v5中,共享订阅通过一些特定的订阅选项来实现。当订阅者创建共享订阅时,可以指定共享订阅的名称和共享订阅策略。

共享订阅名称(Shared Subscription Name)是一个字符串,用于标识共享订阅。订阅者可以根据需要选择一个唯一的名称,以便其他订阅者可以加入相同的共享订阅。

共享订阅策略(Shared Subscription Options)是一个标志集,用于定义共享订阅的行为和属性。MQTT v5中引入了两个共享订阅策略:No LocalRetain As Published

  • No Local:如果订阅者设置了No Local标志,表示不希望接收自己发布的消息。这在某些场景下非常有用,比如在发布-订阅模式下使用同一个客户端同时发布和订阅消息。

  • Retain As Published:如果订阅者设置了Retain As Published标志,表示希望接收保留消息。保留消息是一种特殊类型的消息,它在发布时保留在服务器上,并且每个新的订阅者都会接收到最新的保留消息。

订阅者可以根据自己的需求选择是否设置这些标志。通过设置共享订阅名称和策略,订阅者可以加入相同的共享订阅,并根据共享订阅策略决定自己的消息接收行为。

共享订阅示例

让我们通过一个简单的示例来演示MQTT v5共享订阅的使用。

假设我们有一个主题为sensors/temperature的MQTT主题,多个订阅者对该主题感兴趣。我们希望这些订阅者之间共享订阅,以便实现负载均衡和高可用性。

订阅者A创建一个共享订阅,名称为shared-subscription,并设置No Local标志。这样,订阅者A将不会接收到自己发布的消息。

订阅者B和订阅者C也加入了相同名称为shared-subscription的共享订阅。他们没有设置No Local标志,因此他们将接收到其他订阅者发布的消息。

当发布者发布一条消息到sensors/temperature主题时,消息将被路由到共享订阅shared-subscription。然后,根据共享订阅的策略,订阅者B或订阅者C中的一个将接收到该消息。

如果订阅者A断开连接或不可用,剩下的订阅者B和订阅者C仍然可以继续接收消息,保证了高可用性和容错能力。

总结

MQTT版本5的共享订阅功能为MQTT协议带来了更大的灵活性和可伸缩性。通过共享订阅,我们可以实现负载均衡、高可用性和动态管理订阅者。MQTT v5引入了共享订阅名称和共享订阅策略的概念,订阅者可以根据自己的需求设置这些选项来加入相同的共享订阅。

共享订阅的优势包括负载均衡和扩展性、高可用性、消息过滤和分发,以及动态添加和移除订阅者。这些优势使得共享订阅成为处理大规模消息流量和构建可靠的MQTT系统的有力工具。

在使用共享订阅时,需要注意合理设置共享订阅名称和策略,确保订阅者之间能够正确共享订阅并达到预期的消息分发效果。

MQTT版本5的共享订阅为MQTT协议在物联网和传感器网络领域的应用提供了更大的灵活性和可靠性。通过合理利用共享订阅功能,我们能够构建出高效、可扩展的MQTT系统,满足各种物联网应用的需求。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
3天前
|
消息中间件 测试技术
通过轻量消息队列(原MNS)主题HTTP订阅+ARMS实现自定义数据多渠道告警
轻量消息队列(原MNS)以其简单队列模型、轻量化协议及按量后付费模式,成为阿里云产品间消息传输首选。本文通过创建主题、订阅、配置告警集成等步骤,展示了该产品在实际应用中的部分功能,确保消息的可靠传输。
14 2
|
消息中间件 存储 负载均衡
两个实验让我彻底弄懂了「订阅关系一致」
这篇文章,笔者想聊聊 RocketMQ 最佳实践之一:**保证订阅关系一致**。 订阅关系一致指的是同一个消费者 Group ID 下所有 Consumer 实例所订阅的 Topic 、Tag 必须完全一致。 如果订阅关系不一致,消息消费的逻辑就会混乱,甚至导致消息丢失。
两个实验让我彻底弄懂了「订阅关系一致」
|
6月前
|
消息中间件 Java RocketMQ
MQ产品使用合集之在同一个 Java 进程内建立三个消费对象并设置三个消费者组订阅同一主题和标签的情况下,是否会发生其中一个消费者组无法接收到消息的现象
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
120 1
|
消息中间件 安全 Go
动态订阅时 rocketmq-client-go 代码有map并发bug
动态订阅时 rocketmq-client-go 代码有map并发bug
65 2
|
6月前
|
传感器 监控 网络协议
MQTT 发布、订阅模式介绍
【2月更文挑战第17天】
423 6
MQTT 发布、订阅模式介绍
|
6月前
|
存储 负载均衡 安全
MQTT常见问题之MQTT使用共享订阅失败如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
6月前
|
消息中间件 Java
RabbitMQ中的消息发布-订阅模式是什么?如何实现?
RabbitMQ中的消息发布-订阅模式是什么?如何实现?
167 0
EMQ
|
存储 缓存 网络性能优化
MQTT 订阅选项的使用
在本文中,我们将重点介绍在 MQTT 中哪些订阅选项可供我们使用,以及它们的使用方法。
EMQ
247 0
MQTT 订阅选项的使用
|
23天前
|
消息中间件 JSON Java
开发者如何使用轻量消息队列MNS
【10月更文挑战第19天】开发者如何使用轻量消息队列MNS
63 5
|
18天前
|
消息中间件 存储 Kafka
MQ 消息队列核心原理,12 条最全面总结!
本文总结了消息队列的12个核心原理,涵盖消息顺序性、ACK机制、持久化及高可用性等内容。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。