写点什么

鹅厂分布式大气监测系统:以 Serverless 为核心的云端能力如何打造?

2021 年 3 月 12 日

鹅厂分布式大气监测系统:以 Serverless 为核心的云端能力如何打造?

为了跟踪小区级的微环境质量,腾讯内部发起了一个实验性项目:细粒度的分布式大气监测,希望基于腾讯完善的产品与技术能力,与志愿者们共建一套用于监测生活环境大气的系统。


一、前言


由于项目平台持续建设中,当前已开源信息为二期版本,所以本篇内容均基于此版本能力进行说明。此版本架构进一步优化了数据鉴权及数据库保护。


二期版本首页效果

在建三期版本首页效果

而在建的三期版本中,加入了日志服务 、对象存储、小程序等功能。提供了灵活的日志存储与高速检索能力、 低成本的数据库备份+恢复+迁移同步能力、移动端交互及其它能力。


二、架构组成


整个二期版本的架构组成如下图所示,其中浅蓝色标明的部分是相对一期的架构变更重点。

二期架构图


1. 部署维度


  • 终端:部署在监测点的设备。

  • 云端:部署在云上的平台。

2. 功能维度


以平台设计的基本组成部分,来进行逻辑拆分,并依架构层的设计需求,配套选型的具体产品。

具体功能与选型说明如下:


  • 监测节点:由软硬两部分组成。基于腾讯物联网终端操作系统 TencentOS tiny 开发固件,将兼容腾讯云的硬件设备与腾讯云 IoT explorer 进行了协议级的对接。

  • 本地网关:此部分以通信协议转换为主,不解析具体数据,仅需按前文指引配置即可。

  • 物联网接入层:基于腾讯云 IoT explorer 产品,提供了解密、接入、转发的相关功能。在获取数据后,进行了基于 http 协议的转推动作,传递给下游 API 网关。

  • 中间件层:基于 API 网关提供了衔接及负载均衡等能力,基于鉴权、流控等能力,衔接云函数,提供可靠的数据输入输出服务。

  • 逻辑层:基于云函数,实现了接收数据入库(数据固化)、定时统计汇总(数据分析)、输出应用数据(数据输出,支撑展示)的能力。

  • 存储层:基于云数据库 TencentDB for MySQL,进行监测数据、汇总数据、平台配置的存储。

  • 展示层:基于腾讯云图,提供了地图展示、数据展示、折线图展示等能力。并配置提供联动处理,提高了响应速度,减少了资源文件的重复传输。


三、模块实现


整体系统,以数据为核心,进行了相关设计,所以本部分分为两个组成部分:


  • 数据结构:介绍各环节的核心数据结构与关联模式。

  • 模块说明:介绍各功能模块的实现与对应源码。


1. 数据结构

(1)IoT explorer(物联网开发平台)推送数据结构


以 API 网关推送进来,由云函数在环境变量 event 中提取到的原始数据。其中主要的部分如下:


  • 非'body' 部分,为 API 网关相关信息;

  • 'body' = IoT explorer 原始数据;

  • 'body' = 终端节点上报的原始数据,经 base64 编码。


{    "body": "{\"payload\":\"eyJtZXRob2QiOiJyZXBvcnQiLCJjbGllbnRUb2tlbiI6IjIwMjAtMDgtMThUMTE6MTc6NDkuNDAzWiIsInBhcmFtcyI6eyJQTTFfQ0YxIjo1LCJQTTJkNV9DRjEiOjYsIlBNMTBfQ0YxIjo3LCJQTTEiOjUsIlBNMmQ1Ijo2LCJQTTEwIjo3LCJwYXJ0aWNsZXNfMGQzIjo3OTIsInBhcnRpY2xlc18wZDUiOjI1NCwicGFydGljbGVzXzEiOjE1LCJwYXJ0aWNsZXNfMmQ1IjozLCJwYXJ0aWNsZXNfNSI6MywicGFydGljbGVzXzEwIjowLCJ2ZXJzaW9uIjoxNTEsIkVycm9yIjowfX0=\", \"seq\":18639, \"timestamp\":1597749469,\"topic\":\"$thing/up/property/?????/?????\", \"devicename\":\"?????\", \"productid\":\"?????\"}",    "headerParameters": {},    "headers": {        "accept-encoding": "gzip",        "content-length": "511",        "content-type": "application/json",        "endpoint-timeout": "15",        "host": "service-???-???.gz.apigw.tencentcs.com",        "user-agent": "Go-http-client/1.1",        "x-anonymous-consumer": "true",        "x-api-requestid": "???03a993936ae191f44651???",        "x-b3-traceid": "???03a993936ae191f44651???",        "x-qualifier": "$LATEST"    },    "httpMethod": "POST",    "path": "/??????",    "pathParameters": {},    "queryString": {},    "queryStringParameters": {},    "requestContext": {        "httpMethod": "POST",        "identity": {},        "path": "/??????",        "serviceId": "service-?????",        "sourceIp": "?.?.?.?",        "stage": "release"    }}
复制代码


'body' 经 base64 编码后:



{ "clientToken": "2020-08-18T11:17:49.403Z", "method": "report", "params": { "Error": 0, "PM1": 5, "PM10": 7, "PM10_CF1": 7, "PM1_CF1": 5, "PM2d5": 6, "PM2d5_CF1": 6, "particles_0d3": 792, "particles_0d5": 254, "particles_1": 15, "particles_10": 0, "particles_2d5": 3, "particles_5": 3, "version": 151 }}
复制代码


(2)数据库表单结构


数据库详细格式,请参考 github-sql


https://github.com/eckygao/ampservice_demo/blob/master/amservice.sql


各表用途:


  • config:系统配置表;

  • space:地点表。记录节点部署地点;

  • client:节点表。记录节点信息及最新关键信息,关联 space 表;

  • base_data:日志表。记录每次上报的信息,关联 space、client 表;

  • aggregate_data:汇总信息表。记录按小时、天等时段汇总的数据信息;

  • temp_base_data:临时日志表。上报设备名如不在节点表内,则存入此表,主要用于调测。


2. 模块说明

(1)数据入库


  • 模块功能:接收 IoT explorer 推送数据,匹配并转换后,入数据库;

  • 使用产品:API 网关、无服务器云函数;

  • 关联源码:github-upload[2]

  • 部署方式:请参考相关文章 在线甲醛监测[3] “4.2.2 无服务器云函数/4.2.3 云 API 网关” 章节。


(2)终端在线更新


  • 模块功能:按 3 分钟触发,更新终端信息,用于快速查询与展示;

  • 使用产品:云函数;

  • 关联源码:github-client_active_new

  • 部署方式:请参考相关文章 在线甲醛监测  “4.2.2 无服务器云函数/4.2.3 云 API 网关” 章节,但改为“定时触发”模式。

(3)数据统计


  • 模块功能:按小时及天触发,统计监测数据,用于快速查询与展示;

  • 使用产品:云函数;

  • 关联源码:github-aggregate()

  • 部署方式:请参考相关文章 在线甲醛监测  “4.2.2 无服务器云函数/4.2.3 云 API 网关” 章节,但改为“定时触发”模式。


(4)数据接口-终端汇总信息表


  • 模块功能:通过 API 网关提供数据查询能力,响应云图调用,提供终端汇总信息表;

  • 使用产品:API 网关、云函数;

  • 关联源码:github-client_info

  • 部署方式:请参考相关文章 在线甲醛监测 “4.2.2 无服务器云函数/4.2.3 云 API 网关” 章节。


(5)数据接口-终端单点信息表


  • 模块功能:通过 API 网关提供数据查询能力,响应云图调用,提供终端单点信息表;

  • 使用产品:API 网关、云函数;

  • 关联源码:github-client_data

  • 部署方式:请参考相关文章 在线甲醛监测 “4.2.2 无服务器云函数/4.2.3 云 API 网关” 章节。


(6)数据展示


  • 模块功能:提供 WEB 端展示能力,含地图绘点、列表展示、折线展示等;

  • 使用产品:腾讯云图;

  • 关联源码:无,当前为手工配置;

  • 部署方式:请参考相关文章 在线甲醛监测 “4.2.4 腾讯云图” 章节,但数据源选择时,改为使用“API”。其中“首页”地图使用“数据接口-终端汇总信息表”接口、“单点数据页”使用“数据接口-终端单点信息表”接口。具体调用的接口 URL,请对应 API 网关提供的服务链接。


四、成本分析


二期成本展示


上图表数为每节点每 15 秒上报一次的计算结果。


硬件部分由于厂商与采购量的差异,价格不同。此处以云服务成本计算,如果 10000 节点规模,每节点每分钟上报一次,单节点云服务年成本如下:


1. 二期架构单节点成本


(数据库/年+云图/年)/10000+(API 网关+云函数)/4=(468+48)/10000+(9+2.1)/4=3.335 元


2. 三期架构单节点成本


 (消息队列/年+数据库/年\*2+云图/年)/10000+(云函数+日志服务+对象存储)/4=(3228+468*2+48)/10000+(2.1+2.24+0.02)/4=1.09 元


其中,二期无对象存储及日志服务模块,但当前的在建三期中已使用数月,故有实际数据可列入统计。


五、后续计划


预计完成三期建设,计划内容涉及:


  • 交互优化(done): 启用 space 表,展示地点。

  • 交互建设(doing): 增加小程序能力,提供移动端查询能力,及告警推送能力。

  • 容灾优化 1(done): 增加对象存储,提供低成本数据备份、恢复、异步迁移同步能力。

  • 容灾优化 2(todo): 增加消息队列 CKafka,应对网络异常、数据库异常情况下的数据堆积与丢失风险。

  • 容灾优化 3(doing): 增加日志服务,用于数据对账,应对多环节数据处理中,可能出现的数据丢失或错乱情况。


三期架构预告如下所示,浅蓝色标明的是相对二期的架构变更重点。


三期架构

三期版本部分完成效果展示如下:


WEB 端展示


小程序端 Demo



头图:Unsplash

作者:高树磊

原文:https://mp.weixin.qq.com/s/AopuDdm44JVWrAcr6AIccA

原文:鹅厂分布式大气监测系统:以 Serverless 为核心的云端能力如何打造?

来源:TencentServerless - 微信公众号 [ID:ServerlessGo]

转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2021 年 3 月 12 日 23:011

评论

发布
暂无评论
发现更多内容

Spring Boot+Maven实现车牌训练、识别系统

不脱发的程序猿

maven Spring Boot 图像处理 28天写作 车牌训练、识别系统

Github疯传!阿里内部Java高级工程师面试突击笔记全网首发,这也太香了吧

程序员小毕

Java 面试 分布式 微服务 高并发

用 Go 写一个轻量级的 ldap 测试工具

冯骐

go golang 运维 开发 ldap

一个即将从《蚂蚁金服》离职的Java工程师个人经历与总结

Java成神之路

Java 程序员 架构 面试 编程语言

用 Go 写一个轻量级的 ssh 批量操作工具

冯骐

golang 运维 SSH

拍乐云加盟UCloud优云精选计划,构建云上的美好互动

拍乐云Pano

ucloud 云服务 RTC 拍乐云 白板

思科设备漏洞 CVE-2018-0171 的快速修复

冯骐

Python 运维 安全 网络 交换机

交换机配置的自动备份与变更告警

冯骐

Python 运维 网络 备份 multissh

炸裂!这份阿里P8大佬手写“Java核心技能精选”惨遭疯抢

Crud的程序员

Java 架构

《精通比特币》学习笔记(第一章)

棉花糖

区块链 读书笔记

小目标!2021年薪资要个40k,我肝了200个Java面试题给大家!

Java成神之路

Java 程序员 架构 面试 编程语言

Open-Falcon 中的 LDAP 认证

冯骐

Python golang 运维 Open-Falcon ldap

在主动要求涨工资这事上,不要学我!从第一份工资800开始说起

四猿外

涨薪 工资 收入 程序员· 跳槽

Nginx安装后要做的第一件事

运维研习社

nginx WEB安全

融资租赁是蓝海?区块链告诉你(下)

茜茜公主

日更挑战 三月日更

用 Nginx 的 auth_request 模块集成 LDAP 认证

冯骐

Python nginx 运维 ldap 认证

阿里架构师花近十年时间整理出来的Java核心知识pdf(Java岗)

周老师

Java 编程 程序员 架构 面试

剑指Java面试:面试官能问到的问题,都被我收集在这份PDF文档里

Java成神之路

Java 程序员 架构 面试 编程语言

【LeetCode】俄罗斯套娃信封问题Java题解

HQ数字卡

算法 LeetCode 28天写作 三月日更

Golang 中的并发限制与超时控制

冯骐

golang 并发 超时

2021总结全网最新、最全、最实用Java岗面试真题!已收录GitHub

比伯

Java 编程 架构 面试 程序人生

如何使用Excel表格精准分析PT100温度阻值关系?

不脱发的程序猿

28天写作 PT100 温度采集算法 Excel数据分析 传感器采集

【经验分享】如何释放企业CMDB价值?——CMDB建设路径浅谈

嘉为蓝鲸

运维自动化 配置中心 CMDB 配置信息 配置管理

Serverless 极致弹性解构在线游戏行业痛点

阿里巴巴云原生

Serverless 微服务 开发者 云原生 消息中间件

迄今为止最好用的Flink SQL教程:Flink SQL Cookbook on Zeppelin

Apache Flink

flink

云安全和访问管理

龙归科技

云计算 安全 云端 企业安全

LeetCode题解:190. 颠倒二进制位,移动n,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

融资租赁是蓝海?区块链告诉你(上)

茜茜公主

日更挑战 三月日更

为何每次用完ThreadLocal都要调用remove()?

Java王路飞

Java 程序员 面试 JVM 内存泄漏

Pgbouncer最佳实践:系列四

PostgreSQLChina

数据库 postgresql 软件 开源社区

面试官:如何用SpringCloud从零设计一个大型电商平台?

Java架构追梦

Java 架构 面试 微服务 SpringCloud

鹅厂分布式大气监测系统:以 Serverless 为核心的云端能力如何打造?-InfoQ