IoT设备消息洪峰怎么扛? 阿里云AIoT消息队列深度解读

2024-03-19 05:40

本文主要是介绍IoT设备消息洪峰怎么扛? 阿里云AIoT消息队列深度解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介:本文整理了一份IoT队列的干货知识,让物联网从业者更进一步了解IoT场景队列,一同探讨一个适合于物联网系统的消息队列。

传统的消息队列((Kafka、RocketMQ等)经过多年打磨,在高性能、海量堆积、消息可靠性等诸多方面都已经做得非常极致,但在物联网场景中,往往需要面临着海量的消息传递,传统的消息队列表现的“力不从心”。

IoT领域中,从应用服务器到嵌入式芯片,都需要传递事件消息,比如共享充电宝的开柜子、开灯指令从服务器发到设备、工业网关高频消息流等,在这些信息传递的过程中,队列最大意义在于让整个消息事件在不可控的环境因素变成一个平稳运行的系统,因为IoT设备时不时会由于故障或网络抖动会导致大量消息洪峰。

阿里云AIoT作为物联网领域的引领者和创新者,在消息队列领域不断深耕与沉淀,为了让物联网从业者更进一步了解IoT场景队列,阿里云技术专家吕建文,整理了一份IoT队列的干货知识,与大家一同探讨一个适合于物联网系统的消息队列。


一、IoT队列和普通队列的差异点

1,上下行隔离拆分


在IoT场景中,我们把需要队列分为两个场景,一个是上行队列,一个是下行队列。 拆分之后,可以隔离上下行链路,控制一个设备,比如支付成功要下发打开柜子等,上行出任何问题,千万不能影响到下行业务。另外,上下行两条链路的特点差异非常大。设备上行消息,并发量非常高,但很多场景下对于可靠性和时延要求低,而设备下行消息,并发量则比较低,但下行消息(一般是控制设备指令)要求到达成功率很高。

1.jpg

2,支持设备级的海量topic


传统队列的核心诉求是,不论堆积多少不影响它的性能。kafka的topic一多,原本消息顺序写文件优势就会导致一个broker要退化到随机写,失去优势,另外要zookeeper来协调这么多topic也是有局限,所以这些队列本身有提供一个外挂代理桥接器对外入口是多个设备topic,再桥接映射到少量的实际kafka topic,这方案有一定可行性,但做不到隔离效果,治标不治本。


通过,图1和图2对比较明显,一个队列拥塞尽量减少对其它设备影响。我们需要的是“海量topic尽量相互隔离,并且不影响整体性能”,尽量做到设备A的消息堆积topic,不影响设备B。

2.jpg

3,实时生成消息优先发送


先举一个例子,一个快递柜业务的队列堆积,然后“此时此刻”在柜子旁边的用户死命的在旁边用手机点开柜子怎么也打不开(此时后端系统都恢复了),问题就是队列里面还有几十万条的消息,新来的消息需要排队, 等着之前的那些消息消费完,甭管这些消息还有没有用。  因此,实时生成消息优先发送,堆积的消息进入降级模式。


二、IoT消息队列诞生


1, IoT队列的设计思路

3.jpg

设计目标是为了打造一个支持上下行隔离、实时优先、及海量topic的队列网关,设计原则如下:

  • 完全follow开源生态、和传统队列互补兼容
  • 保序降级,实时优先,堆积退化;仅实时消息相对有序。
  • 海量topic,多租户隔离
  • 连接、计算、存储分离
2, 消息模式


图片只是个片段,从这个模式可以看出来机制差别,大家都没有错,只是出发点不同。

4.jpg

3, 连接、计算、存储分离

5.jpg

broker不做连接,连接网关代理,broker只做流转分发,无状态+水平扩展;存储交给nosql DB,高吞吐写。

4, 消息策略-推拉结合


这个应该是队列的核心难点之一,和传统队列区分在于,我们考虑为平台化模式,独享资源过于昂贵。但带来问题是消费端不可控,所以使用结合模式,只有在消费者在线时会拉取堆积消息,而拉取是由AMQP队列网关来做,给到用户接口始终是推送过去的onMessage回调。

6.jpg

  • broker不是直接让consumer来连接,而是把队列网关剥离出来,  这样会更灵活,甚至对于部分用户我们的queue可以切换到ons、kafka等实现。kafka、rocketmq做法是在连接时会分配给客户端一个broker接入地址。


  • broker实时消息优先推送给consumer,失败才会落到queue ;这是一个完整事件,如果没有完成则不给producer commit。


  • 异步ACK


5, 线性扩展-离线消息部分


实时部分消息采用推方式,基本上不会成为瓶颈,消费不过来消息进入堆积模式。由于底层依赖存储已经帮我们解决核心存储的扩展,剩下主要问题点在于如何消除写入热点和消费热点,这样broker可以完全做到无状态。

640.png

三,一个思考——如何解决海量topic问题?



首先面对“大量”的问题一般都是考虑分区,单元化,分组等隔离和拆分,这里海量topic我们讨论针对一个单实例模式下如何尽可能做到更多topic,完全任意数量都能100%没问题肯定是不现实的。


由于broker和存储已经隔离,broker和topic已经没有什么关系,或者说任何topic数据生成,broker做的事情就是写入和分发。

  • 海量topic,每个topic有限数量订阅:  topic和订阅者关系使用redis缓存或本地缓存,针对mqtt topic匹配有个topic tree的树算法,hivemq有实现版本。
  • 单个topic 海量订阅:  这个场景其实是组播和广播,我们不会考虑在队列本身上面去做这个事情,而是在上层封装广播组件来协调任务和批量发送。 


四, 阿里云AIoT消息队列

8.jpg

目前阿里云AIoT队列,也叫服务端订阅,意思就是用户用服务端订阅他们设备消息。为了降低接入成本,用户可以使用AMQP1.0协议接入,符合开源生态。 同时兼容传统队列和新队列,交给用户按场景来选择,用户即可选择使用kafka、mq,也可以选用iot队列,甚至组合模式,比如按消息特征规则来配置流转队列。

阿里云AIoT的场景队列实践,在现有mq队列、kafka队列融合之外,加了种自有的实时优先队列实现,同时,加入了队列网关代理,既能让用户选择普通消息队列,也可以选择轻便的IoT消息队列。

原文链接:https://developer.aliyun.com/article/785685?

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

这篇关于IoT设备消息洪峰怎么扛? 阿里云AIoT消息队列深度解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/824977

相关文章

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr

关于Gateway路由匹配规则解读

《关于Gateway路由匹配规则解读》本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Ga... 目录Gateway路由匹配规则一、基本概念二、常用属性三、实际应用四、注意事项总结Gateway路由

Rsnapshot怎么用? 基于Rsync的强大Linux备份工具使用指南

《Rsnapshot怎么用?基于Rsync的强大Linux备份工具使用指南》Rsnapshot不仅可以备份本地文件,还能通过SSH备份远程文件,接下来详细介绍如何安装、配置和使用Rsnaps... Rsnapshot 是一款开源的文件系统快照工具。它结合了 Rsync 和 SSH 的能力,可以帮助你在 li

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C