车联网平台百万级消息吞吐架构设计|车联网系列专题 05
off999 2025-03-19 01:04 31 浏览 0 评论
前言
车辆在行驶过程中,会持续不断产生海量的消息,每一条通过车联网上报的数据都是非常珍贵的,其背后蕴藏着巨大的业务价值。因此我们构建的车辆 TSP 平台也通常需要拥有千万级主题和百万级消息吞吐能力。
传统的互联网系统很难支撑百万量级的消息吞吐。在本文中,我们将主要介绍如何针对百万级消息吞吐这一需求进行新一代车联网平台架构设计。
车联网场景消息吞吐设计的关联因素
车联网的消息分为上行和下行。
上行消息一般是传感器及车辆发出的告警等消息,把设备的信息发送给云端的消息平台。下行消息一般有远程控制指令集消息和消息推送,是由云端平台给车辆发送相应的指令。
在车联网消息吞吐设计中,我们需要重点考虑以下因素:
消息频率
车在行驶过程中,GPS、车载传感器等一直不停地在收集消息,为了收到实时的反馈信息,其上报接收的消息也是非常频繁的。上报频率一般在 100ms-30s 不等,所以当车辆数量达到百万量级时,平台就需要支持每秒百万级的消息吞吐。
消息包大小
整个消息包大小一般在 500B 到几十 KB 不等。当大量消息包同时上报时,需要车联网平台拥有更强的接收、发送大消息包的能力。
消息延时
车辆在行驶过程中,消息数据只能通过无线网络来进行传输。在大部分车联网场景下,对车辆的时延要求是 ms 级别。平台在满足百万级吞吐条件下,还需要保持低延时的消息传输。
Topic 数量和层级
在考虑百万级消息吞吐场景时,还需要针对消息 Topic 数量和 Topic 树层级进行规范设计。
Payload 编解码
当消息包比较大的时候,需要重点考虑消息体的封装。单纯的 JSON 封装在消息解析时不够高效,可以考虑采用 Avro、Protobuf 等编码格式进行 Payload 格式化封装。
对于百万级消息吞吐场景,基于 MQTT 客户端共享订阅消息或通过规则引擎实时写入关系型数据库的传统架构显然无法满足。
目前主流的架构选型有两种:一种是消息接入产品/服务+消息队列(Kafka、Pulsar、RabbitMQ、RocketMQ 等),另外一种是消息接入产品/服务+时序数据库(InfluxDB、TDengine、Lindorm 等)来实现。
接下来我们将基于上述的关联因素和客户案例的最佳实践,以云原生分布式物联网消息服务器 EMQX 作为消息接入层,分别介绍这两种架构的实现方式。
EMQX+Kafka 构建百万级吞吐车联网平台
架构设计
Kafka 作为主流消息队列之一,具有持久化数据存储能力,可进行持久化操作,同时可通过将数据持久化到硬盘以及 replication 防止数据丢失。后端 TSP 平台或者大数据平台可以批量订阅想要的消息。
由于 Kafka 拥有订阅发布的能力,既可以从南向接收,把上报消息缓存起来;又可以通过北向的连接,把需要发送的指令通过接口传输给前端,用作指令下发。
我们以 Kafka 为例,构建 EMQX+Kafka 百万级吞吐车联网平台:
- 前端车机的连接与消息可通过公有云商提供的负载均衡产品用作域名转发,如果采用了 TLS/DTLS 的安全认证,可在云上建立四台 HAProxy/Nginx 服务器作为证书卸载和负载均衡使用。
- 采用 10 台 EMQX 组成一个大集群,把一百万的消息吞吐平均分到每个节点十万消息吞吐,同时满足高可用场景需求。
- 如有离线离线/消息缓存需求,可选用 Redis 作为存储数据库。
- Kafka 作为总体消息队列,EMQX 把全量消息通过规则引擎,转发给后端 Kafka 集群中。
- 后端 TSP 平台/OTA 等应用通过订阅 Kafka 的主题接收相应的消息,业务平台的控制指令和推送消息可通过 Kafka/API 的方式下发到 EMQX。
引用或分隔线
在这一方案架构中,EMQX 作为消息中间件具有如下优势,可满足该场景下的需求:
- 支持千万级车辆连接、百万级消息吞吐能力。
- 分布式集群架构,稳定可靠,支持动态水平扩展。
- 强大的规则引擎和数据桥接、持久化能力,支持百万级消息吞吐处理。
- 拥有丰富 API 与认证等系统能顺利对接。
百万吞吐场景验证
为了验证上述架构的吞吐能力,在条件允许的情况下,我们可以通过以下配置搭建百万级消息吞吐测试场景。压测工具可以选用 Benchmark Tools、JMeter 或 XMeter 测试平台。共模拟 100 万设备,每个设备分别都有自己的主题,每个设备每秒发送一次消息,持续压测 12 小时。
压测架构图如下:
性能测试部分结果呈现:
EMQX 规则引擎中可以看到每个节点速度为 10 万/秒的处理速度,10 个节点总共 100 万/秒的速度进行。
在 Kafka 中可以看到每秒 100 万的写入速度,并且一直持续存储。
EMQX+InfluxDB 构建百万级吞吐车联网平台
架构设计
采用 EMQX+ 时序数据库的架构,同样可以构建百万级消息吞吐平台。在本文我们以 InfluxDB 时序数据库为例。
InfluxDB 是一个高性能的时序数据库,被广泛应用于存储系统的监控数据、IoT 行业的实时数据等场景。它从时间维度去记录消息,具备很强写入和存储性能,适用于大数据和数据分析。分析完的数据可以提供给后台应用系统进行数据支撑。
此架构中通过 EMQX 规则引擎进行消息转发,InfluxDB 进行消息存储,对接后端大数据和分析平台,可以更方便地服务于时序分析。
- 前端设备的消息通过云上云厂商的负载均衡产品用作域名转发和负载均衡。
- 本次采用 1 台 EMQX 作为测试,后续需要时可以采用多节点的方式,组成相应的集群方案(测试 100 万可以部署 10 台 EMQX 集群)。
- 如有离线离线/消息缓存需求,可选用 Redis 作为存储数据库。
- EMQX 把全量消息通过规则引擎转发给后端 InfluxDB 进行数据持久化存储。
- 后端大数据平台通过 InfluxDB 接收相应的消息,对其进行大数据分析,分析后再通过 API 的方式把想要的信息传输到 EMQX。
场景验证
如测试架构图中所示,XMeter 压力机模拟 10 万 MQTT 客户端向 EMQX 发起连接,新增连接速率为每秒 10000,客户端心跳间隔(Keep Alive)300 秒。所有连接成功后每个客户端每秒发送一条 QoS 为 1、Payload 为 200B 的消息,所有消息通过 HTTP InfluxDB 规则引擎桥过滤筛选并持久化发至 InfluxDB 数据库。
测试结果呈现如下:
单台 EMQX 服务器实现了单台服务器 10 万 TPS 的消息吞吐持久化到 InfluxDB 能力。参考 EMQX+Kafka 架构的测试场景,将 EMQX 的集群节点扩展到 10 台,就可以支持 100 万的 TPS 消息吞吐能力。
结语
通过本文,我们介绍了车联网场景消息吞吐设计需要考虑的因素,同时提供了两种较为主流的百万级吞吐平台架构设计方案。面对车联网场景下日益增加的数据量,希望本文能够为相关团队和开发者在车联网平台设计与开发过程中提供参考。
相关推荐
- Python钩子函数实现事件驱动系统(created钩子函数)
-
钩子函数(HookFunction)是现代软件开发中一个重要的设计模式,它允许开发者在特定事件发生时自动执行预定义的代码。在Python生态系统中,钩子函数广泛应用于框架开发、插件系统、事件处理和中...
- Python函数(python函数题库及答案)
-
定义和基本内容def函数名(传入参数):函数体return返回值注意:参数、返回值如果不需要,可以省略。函数必须先定义后使用。参数之间使用逗号进行分割,传入的时候,按照顺序传入...
- Python技能:Pathlib面向对象操作路径,比os.path更现代!
-
在Python编程中,文件和目录的操作是日常中不可或缺的一部分。虽然,这么久以来,钢铁老豆也还是习惯性地使用os、shutil模块的函数式API,这两个模块虽然功能强大,但在某些情况下还是显得笨重,不...
- 使用Python实现智能物流系统优化与路径规划
-
阅读文章前辛苦您点下“关注”,方便讨论和分享,为了回馈您的支持,我将每日更新优质内容。在现代物流系统中,优化运输路径和提高配送效率是至关重要的。本文将介绍如何使用Python实现智能物流系统的优化与路...
- Python if 语句的系统化学习路径(python里的if语句案例)
-
以下是针对Pythonif语句的系统化学习路径,从零基础到灵活应用分为4个阶段,包含具体练习项目和避坑指南:一、基础认知阶段(1-2天)目标:理解条件判断的逻辑本质核心语法结构if条件:...
- [Python] FastAPI基础:Path路径参数用法解析与实例
-
查询query参数(上一篇)路径path参数(本篇)请求体body参数(下一篇)请求头header参数本篇项目目录结构:1.路径参数路径参数是URL地址的一部分,是必填的。路径参...
- Python小案例55- os模块执行文件路径
-
在Python中,我们可以使用os模块来执行文件路径操作。os模块提供了许多函数,用于处理文件和目录路径。获取当前工作目录(CurrentWorkingDirectory,CWD):使用os....
- python:os.path - 常用路径操作模块
-
应该是所有程序都需要用到的路径操作,不废话,直接开始以下是常用总结,当你想做路径相关时,首先应该想到的是这个模块,并知道这个模块有哪些主要功能,获取、分割、拼接、判断、获取文件属性。1、路径获取2、路...
- 原来如此:Python居然有6种模块路径搜索方式
-
点赞、收藏、加关注,下次找我不迷路当我们使用import语句导入模块时,Python是怎么找到这些模块的呢?今天我就带大家深入了解Python的6种模块路径搜索方式。一、Python模块...
- 每天10分钟,python进阶(25)(python进阶视频)
-
首先明确学习目标,今天的目标是继续python中实例开发项目--飞机大战今天任务进行面向对象版的飞机大战开发--游戏代码整编目标:完善整串代码,提供完整游戏代码历时25天,首先要看成品,坚持才有收获i...
- python 打地鼠小游戏(打地鼠python程序设计说明)
-
给大家分享一段AI自动生成的代码(在这个游戏中,玩家需要在有限时间内打中尽可能多的出现在地图上的地鼠),由于我现在用的这个电脑没有安装sublime或pycharm等工具,所以还没有测试,有兴趣的朋友...
- python线程之十:线程 threading 最终总结
-
小伙伴们,到今天threading模块彻底讲完。现在全面总结threading模块1、threading模块有自己的方法详细点击【threading模块的方法】threading模块:较低级...
- Python信号处理实战:使用signal模块响应系统事件
-
信号是操作系统用来通知进程发生了某个事件的一种异步通信方式。在Python中,标准库的signal模块提供了处理这些系统信号的机制。信号通常由外部事件触发,例如用户按下Ctrl+C、子进程终止或系统资...
- Python多线程:让程序 “多线作战” 的秘密武器
-
一、什么是多线程?在日常生活中,我们可以一边听音乐一边浏览新闻,这就是“多任务处理”。在Python编程里,多线程同样允许程序同时执行多个任务,从而提升程序的执行效率和响应速度。不过,Python...
- 用python写游戏之200行代码写个数字华容道
-
今天来分析一个益智游戏,数字华容道。当初对这个游戏颇有印象还是在最强大脑节目上面,何猷君以几十秒就完成了这个游戏。前几天写2048的时候,又想起了这个游戏,想着来研究一下。游戏玩法用尽量少的步数,尽量...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python自定义函数 (53)
- python进度条 (67)
- python吧 (67)
- python字典遍历 (54)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python串口编程 (60)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python字典增加键值对 (53)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python人脸识别 (54)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)