IoT Thingsboard 微服务分布式 mqtt设备控制 架构与可用性分析

这篇具有很好参考价值的文章主要介绍了IoT Thingsboard 微服务分布式 mqtt设备控制 架构与可用性分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

欢迎star 该 github, IoT 服务器架构与设计 Blog🐵(后续该文章的优化修改只会在Github改)

本文来分析:【前端或Postman通过rpc API(http)控制mqtt设备】在分布式集群下的架构与流程

下图是官网的微服务架构图
  问题:一般普通(没长连接+发布订阅)、理想而标准的微服务,应该设计为无状态(stateless)的且服务间单向调用。无状态就比如一个服务(后面用service表示,如图中的tb-core服务)的集群(cluster)由2个节点(后面用node表示)组成,那么每次请求一个service时,应该可以路由到service下的任意一个node去处理(不同node都应是一样的处理结果)。但thingsboard其实并不是一个stateless的微服务,也非单向rpc调用,从该图看不出数据在service间是怎么传递的。网络上也找不到有分析该过程的文章(如有请留言发给我),为此我画了下面的图去分析。
IoT Thingsboard 微服务分布式 mqtt设备控制 架构与可用性分析

【前端或Postman通过rpc API(http)控制mqtt设备】分布式流程

下图的3个service和上图红线中的3个service对应,但细致到了node与node间通讯的topic与路径,后面针对该图进行分析
IoT Thingsboard 微服务分布式 mqtt设备控制 架构与可用性分析
(图左边的topic是自己100%抓到的,右边的topic并没有完全debug,所以不敢100%确定,右边如有哪部分不对,请详细说明下流程给我):
1,右边的设备通过mqtt协议连接mqtt-transport服务,被LB(load balancer)随机分配到了mqtt-transport-1的node,并把该deviceId在哪个node的映射关系保存到了redis
2,左边的postman通过http协议,被LB随机分配到了tb-core-1的node,为该次请求生成一个requestId, 然后通过对deviceId进行hash % partition的数量4,计算得到该deviceId的partition是3,所以把控制数据发到了tb_rule_engine_main的第3个partition
3,rule-engine-1根据deviceId从redis查到该设备连接在mqtt-transport-1节点,将消息发给tb_transport.api.requests.notification.mqtt-transport-1的节点(注意,该topic没有partition,notification的topic就是每个node单独订阅自己的消息)
4,设备收到requestId 5的控制,响应控制成果,也带有requestId 5
5,mqtt-transport-1通过deviceId的一致性hash,该消息被rule-engine-1的node消费
6,rule-engine-1通过notification的topic把消息发给tb-core-1
7,tb-core-1通过deviceId和requestId,将http进行响应(kafka是异步,http是同步,此处异步转同步的代码实现其他文章分享)

重点1:HAproxy(和nginx一样)做负载均衡, 随机分配节点

  使用了最小连接数的负载均衡策略,即HAproxy会把新的request分配给当前连接数最小的node。
    左边postman每次http请求,都可能分配到和上次不同的node处理
    右边设备device每次mqtt进行连接connect,都可能分配到和上次不同的node处理,但因为mqtt是长连接(用netty管理),connect后每次publish消息,都是同一个node在处理。但如果将该连接disconnect再connect,就可能分配到不同的node去处理。

重点2:thingsboard后台节点之间通讯全是用的kafka。

kafka的基础理解:
1,一个topic有多个partition
2,一个消息只会被consumer group中的一个consumer消费
3,一个partition只会被一个consumer消费

重点3:一致性hash算法的应用,保证一个device的数据分配到同一个节点

  作用:保证同一个设备的数据只会在一个node上处理
  应用在何处:图中间的rule-engine
  为什么要保证同一个设备的数据都在一个node处理:rule-engine是有状态的服务,同时用了actor模式,每一个device就是一个deviceActor对象,比如如图,只有rule-engine-1知道requestId为5的请求的原始请求node是tb-core-1从而完成response的业务,rule-engine-2并不知道(该信息应该是保存在内存中的,还没从源码100%确定);这样一个设备的数据只保存在一个node中,也防止了内存爆炸,其实mqtt-transport服务也一样,如果有10万netty管理的mqtt长连接,那5万在node1,5万在node2。

重点4:异步转同步的代码实现

kafka是异步,http是同步,此处异步转同步的代码实现其他文章分享



下图是官网对于消息队列queue(kafka)的文档说明(不想看可忽略)
IoT Thingsboard 微服务分布式 mqtt设备控制 架构与可用性分析

增加节点后,如何re-hash?是否有一定时间的不可用?

https://stackoverflow.com/questions/74650502/for-microservice-how-to-add-nodes-for-kafka-and-tb-rule-engine-at-runtime-will
关于增加节点的操作与影响,官方文档并无说明,我提了个case,被thingsboard的架构师回答了,算是可靠答案了。
1,节点发生增删时,其他节点都会通过zookeeper得到通知,进行re-hash,所以partition或service的node数量在各node会得到更新
2,增加一个rule-engine节点,因为一部分partition会移到新的node上,而此时旧的node可能还没commit,可能就会出现一个消息被消费了2次。而因为旧的node会停止消费部分partition,新的node会开始消费,这中间可能会有短暂的处理速度的下降。

一个节点挂了后会怎样

比如mqtt-transport-1的node挂了,设备端的连接就断了,需要设备端有重连机制(为了防止大量设备断开服务器,同时向服务器进行connect,瞬时高峰可能会把其他node请求挂了形成雪崩效应,设备端应该有指数退避+随机数的设计,即5秒连不上服务器,下次10秒连接,不能连接失败就立刻重连)。
所以挂了对当前的连接和消息可能会有些影响的,但一般对业务影响不大,另外内部服务间有kafka的commit确认机制与重试机制,这些措施可以保证不会丢数据。

其他架构方案思考

在http和mqtt接入的node也可以使用一致性hash的设计,使同一deviceId的数据在同一节点处理,也就是client连接到任意一个node,该node计算hash后,如果不在该node自己,再将该设备的连接重定向到其一致性hash应该连接到node上。

大家都有什么想法或想讨论的,欢迎最下方点击留言!

部分重要定位日志截图:
1,一致性hash代码,根据deviceId算出hash再除以分区partition数量
IoT Thingsboard 微服务分布式 mqtt设备控制 架构与可用性分析

2,redis中device的session保存了该设备连接到了哪个node(因为用了非明文的protobuf,第二张图是proto骨架文件,所以看到的大部分是乱码)
IoT Thingsboard 微服务分布式 mqtt设备控制 架构与可用性分析
IoT Thingsboard 微服务分布式 mqtt设备控制 架构与可用性分析

3,将节点通过notification的topic,发给指定的node
IoT Thingsboard 微服务分布式 mqtt设备控制 架构与可用性分析文章来源地址https://www.toymoban.com/news/detail-401962.html

该文章的留言讨论区,欢迎留言相互讨论

到了这里,关于IoT Thingsboard 微服务分布式 mqtt设备控制 架构与可用性分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Zeus IoT : 基于 SpringBoot 的分布式开源物联网大数据平台

    Zeus IoT 是一个集设备数据 采集、存储、分析、观测 为一体的开源物联网平台,全球首创基于 Zabbix 的物联网分布式数据采集架构,具备超 百万级 物联网设备的并发监控能力,真正具备 工业级性能与稳定性 的开源物联网大数据中台。 Zeus IoT 致力于让设备接入和数据处理变得

    2024年02月05日
    浏览(53)
  • IoT DC3 是一个基于 Spring Cloud 的开源的、分布式的物联网(IoT)平台本地部署步骤

    ​​ 必要软件环境 进入原网页# 务必保证至少需要给 docker 分配:1 核 CPU 以及 4G 以上的运行内存! JDK : 推荐使用 Oracle JDK 1.8 或者 OpenJDK8 ,理论来说其他版本也行; Maven : 推荐使用 Maven 3.8 ,理论来说其他版本也行; IDE : IntelliJ IDEA 或者 Eclipse ,理论来说其他 Java IDE 也行;

    2024年02月11日
    浏览(42)
  • 设备通过thingsboard iot gateway 来获取属性和更新属性

    此部分中的配置是可选的。 为了向ThingsBoard服务器节点请求客户端或共享设备属性,网关允许发送属性请求。 属性 默认值 描述 retain false 如果设置为true,该消息将被设置为主题的“最后已知良好”/保留消息。 topicFilter v1/devices/me/attributes/request 属性请求的主题 deviceNameJsonE

    2024年02月12日
    浏览(34)
  • ROS分布式演练,多台设备进行通信的配置

    前面我们做的操作都是在单个设备上进行,也就是分别开启多个终端,在不同终端上启动节点等相关操作,这里我们使用两台设备来控制, 一台虚拟机和一台无人车 (使用VNC Viewer连上去,也可以看做一台Linux虚拟机) VNC Viewer有兴趣的可以查阅:远程连接VNC-Viewer与安全传输Wi

    2024年02月05日
    浏览(31)
  • 高级分布式系统-第14讲 分布式控制经典理论

    高级分布式系统汇总:高级分布式系统目录汇总-CSDN博客 模糊控制是一种以模糊集合论、模糊语言变量以及模糊逻辑推理为数学基础的控制方法,它模拟人的思维,构造一种非线性控制,以满足复杂的不确定的过程控制的需要,属于智能控制范畴。 由于模糊控制是对人的思维

    2024年02月01日
    浏览(33)
  • 高级分布式系统-第12讲 分布式控制经典理论

    高级分布式系统汇总:高级分布式系统目录汇总-CSDN博客 分布式控制系统的设计,是指在给定系统性能指标的条件下,设计出控制器的控制规律和相应的数字控制算法。 根据偏差的比例(Proportional)、积分(Integral)、微分(Derivative)进行控制(简称PID控制),一种广泛应用

    2024年01月20日
    浏览(41)
  • 高级分布式系统-第10讲 分布式控制系统

    高级分布式系统汇总:高级分布式系统目录汇总-CSDN博客 自动化是关于一切人造系统自动、智能、自主、高效和安全运行的科学与技术 计算机控制技术是实现自动化的主要方法和手段 分布式控制技术是伴随着机器大工业生产而诞生的特殊计算机控制技术 指利用计算机(通常

    2024年01月19日
    浏览(51)
  • OpenHarmony 4.0 分布式软总线解析:设备发现与传输

    OpenHarmony 的分布式软总线子系统为 OpenHarmony 系统提供的通信相关的能力,包括:WLAN 服务能力、蓝牙服务能力、软总线、进程间通信 RPC(Remote Procedure Call)等通信能力。 其中主要包括: WLAN 服务:为用户提供 WLAN 基础功能、P2P(peer-to-peer)功能和 WLAN 消息通知的相应服务,

    2024年04月23日
    浏览(37)
  • 分布式版本控制git

    远端仓库 git init --bare 别名: origin 本地仓库 git clone … SSH协议是一个验证授权的网络协议; 使用ssh公钥登录git服务器: 生成公钥和私钥(ssh-keygen -t rsa) 安装openssh server (可省略) 复制公钥内容到远端服务器.ssh/authorized_ keys git clone ssh://mark@ 192.168.31.91:/home/mark/mathlib 暂存(git add) 提交

    2024年02月11日
    浏览(55)
  • 分布式版本控制工具——git

    ✅1主页::我的代码爱吃辣 📃2知识讲解:Linux——git ☂️3开发环境:Centos7 💬4前言:git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。  也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 目录

    2024年02月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包