MQTT实现集群分布式消费

ops/2024/12/24 2:00:55/

今天被问到启用多个应用消费时,每个消费者都会受到订阅消息的事。很久前用过,这里梳理记录一下:

MQTT协议本身是支持共享订阅功能。

这里这个共享订阅比较特殊,他有点类似kafka的消费组的概念。但是设计和实现上区别比较大。

设计理念

MQTT 共享订阅:

        主要是为了在 MQTT 的发布 / 订阅模式下,实现多个订阅者对同一主题消息的高效共享和负载均衡,确保消息能够被多个订阅者均匀接收和处理,同时避免消息的重复消费。


Kafka 消费组:

        基于 Kafka 的分布式消息队列架构设计,旨在实现多个消费者对多个主题分区消息的并行消费,通过消费组内的消费者协调机制,提高消息处理的吞吐量和可扩展性。


实现方式

MQTT 共享订阅:

        通过在订阅主题前添加 “$share/<group>/<topic>” 的形式来标识共享订阅组,其中<group>为共享订阅组的名称,<topic>为实际的订阅主题。当消息发布到该主题时,MQTT broker 会根据一定的算法将消息分配到不同的订阅者,实现负载均衡。


Kafka 消费组:

        Kafka 将每个主题划分为多个分区,每个分区中的消息是有序的。消费者以消费组的形式进行组织,同一消费组内的消费者共同消费主题的所有分区。每个分区在同一时刻只能被一个消费者消费,不同消费组之间相互独立,互不影响。


消息分配策略

MQTT 共享订阅:

        通常采用轮询或随机等简单的分配策略,将消息依次或随机分配给不同的订阅者。分配过程相对简单直接,主要考虑的是在多个订阅者之间实现基本的负载均衡。


Kafka 消费组:

        采用的是基于分区分配策略,如范围分配、轮询分配等。根据消费者数量和分区数量的关系,将分区合理分配给不同的消费者,确保每个消费者能够均匀地处理消息,同时充分利用分区的并行性。


消费语义

MQTT 共享订阅:

        一般遵循 “最多一次” 或 “至少一次” 的消息传递语义。在 “最多一次” 语义下,消息可能会丢失;在 “至少一次” 语义下,消息可能会被重复接收和处理,需要应用层自行处理去重等问题。


Kafka 消费组:

支持多种消费语义,如 “最多一次”“至少一次”“精确一次” 等。通过配置不同的参数和使用 Kafka 提供的事务机制等,可以实现不同的消费语义,满足不同应用场景的需求。


应用场景

MQTT 共享订阅:

        适用于对实时性要求较高、消息量相对较小且需要多个订阅者共享消息的场景,如物联网设备数据的实时监控和分发,多个客户端需要同时接收并处理设备上报的实时数据。

Kafka 消费组:

        更适合处理大规模的消息流,对消息的吞吐量和可扩展性要求较高的场景,如实时日志收集与分析、大数据流处理等,能够支持多个消费者并行处理大量的消息数据。

以上对比了下mqtt和kafka的实现区别。这里回归mqtt共享订阅的实现。

MQTT共享订阅实现

        首先,MQTT共享订阅需要EMQx版本支持,EMQx5.0以上版本默认支持,一下版本需要部分需要配置,部分无法支持,这个需要的去官网确认。

        

然后就是上面介绍的共享订阅的规则。这边其实是订阅时路径的约定:

“$share/<group>/<topic>”

需要用"$share"标识是共享订阅,后面紧跟的第一个单词是group分组名称,在后面可以和普通topic一样使用。

需要注意的是,订阅的时候采用这个格式,但是发布消息的时候,topic需要正常设置。不需要配置“$share/<group>/”的信息。

共享订阅策略,就是配置是轮训、或者加权轮询、或者随机等负载方案了。

注意,这里推荐配合qos使用,避免消息的丢失。

以上。


http://www.ppmy.cn/ops/144445.html

相关文章

数据可视化echarts学习笔记

目录&#xff0c;介绍 知识储备 一端操作&#xff0c;多端联动的效果&#xff08;开启了多个网页&#xff0c;操作一端&#xff0c;多个网页的效果会跟着改变&#xff09; cmd命令控制面板返回上一级或上上级 在当前目录打开文件&#xff1a; cd 文件名 在Windows命令提示符&am…

群落生态学研究进展】Hmsc包开展单物种和多物种分析的技术细节及Hmsc包的实际应用

联合物种分布模型&#xff08;Joint Species Distribution Modelling&#xff0c;JSDM&#xff09;在生态学领域&#xff0c;特别是群落生态学中发展最为迅速&#xff0c;它在分析和解读群落生态数据的革命性和独特视角使其受到广大国内外学者的关注。在学界不同研究团队研发出…

QT多媒体开发(二):播放音频

简介 QMediaPlayer 可以用于播放经过压缩的音频文件&#xff0c;如 MP3 文件和 WMA 文件。QSoundEffect 可以 用于播放低延迟音效文件&#xff0c;例如无压缩的 WAV 文件。这两个类都可以用于播放本地文件和网络文件。 QMediaPlayer 与播放音频相关的接口函数如下&#xff1a…

VSCode下的编译、调试、烧录

一、编译程序 程序编译可以通过2种方式&#xff1a;pio左栏按钮、命令行&#xff1b; 1. Pio左栏按钮&#xff1a; 点下按钮编译后&#xff0c;会自动弹出终端窗口显示编译过程。 2. 命令行方式&#xff1a; 在“终端”通过命令行进行的工程编译。命令&#xff1a;pio run …

Java设计模式 —— 【结构型模式】装饰者模式详解

文章目录 前言结构说明案例演示小结静态代理和装饰者的区别 前言 在日常生活中&#xff0c;我们常会遇到一种场景&#xff1a;去快餐店吃饭&#xff0c;里面琳琅满目的主食&#xff0c;还有各式各样的配菜作为消费者&#xff0c;只管挑选就行&#xff0c;但是如果让我们来设计…

梳理Nginx 的七大应用场景

文章目录 前言1. Web服务器2. 反向代理服务器3. 负载均衡器4. 静态文件服务器5. SSL/TLS终端代理6. Web应用防火墙7. API网关总结前言 Nginx 是一个高性能的 HTTP 和反向代理服务器,它以其轻量级、高并发处理能力而闻名。以下是 Nginx 的七大应用场景,以及相应的示例配置文件…

matlab的一些时间函数【转】

看到就记下来&#xff0c;感觉挺好玩的。 原文&#xff1a;MATLAB-一些时间函数 - 简书 (jianshu.com) 注明出处了&#xff0c;原文是公开的&#xff0c;应该不算侵权。若有侵权请告知删除谢谢。

游泳溺水识别数据集,对9984张原始图片进行YOLO,COCO JSON, VOC XML 格式的标注,平均识别率在91.7%以上

游泳溺水识别数据集&#xff1a; 对9984张原始图片进行YOLO&#xff0c;COCO JSON, VOC XML 格式的标注&#xff0c;平均识别率在91.7&#xff05;以上 &#xff0c;可识别泳池或者水库中是否有人溺水。 数据集分割 训练组98&#xff05; 9818图片 有效集&#xff05;…