先吐槽一下,一开始看了ppt,觉得很高大上,但后面听了演讲后,基本就是读ppt,真是一口老血=。=
IoT的挑战
规模上物联网设备将会达到数百亿级别,包括可穿戴设备,家庭智能设备,工业网关等。存储上面对海量的存储,需要使用分布式的时序数据库。协议上看,需要有注重安全,个人隐私,防止攻击,数据安全的协议。
百度的物联网平台解决方案
用户通过终端SDK接入,使用MQTT协议。数据储存使用对象存储,NoSQL,关系型DB和时序数据库。对行业服务,提供物解析,预测性维保和嵌入式可视化报表等。所谓物解析(IoT Parser),就是简单快速完成各种设备数据协议解析。
用户通过工业网关或者设备终端,接入MQTT服务。MQTT服务依赖其服务,HBase做数据的存储,Redis做数据的缓存,ZooKeeper做broker之间数据的协调。用户可以用Rule Engine来自定义一些数据服务,只需使用sql语句就可操作。之后,数据通过Kafka,对数据做流处理和批处理,最后对过滤后的数据进行存储(使用NoSQL,MySql,DFS,TSDB)。
协议的选择
百度选择使用MQTT协议。CoAP,使用基于UDP,因而反控性能较差。XMPP和HTTP都是比较重的协议,数据量较大。
MQTT有如下特点:
- 使用心跳维持连接
可以用来检测client和server之间的连接状态,同时还可以维护NAT地址映射表 - 遗愿信息功能
指定当client和server之间失去连接之后,server需要往指定的topic发送特定QoS的级别的消息 - 能保留消息
一个特定主题的消息会保留到服务器,当任何一个client订阅了这个主题,都会首先收到这个消息。 -
持久化订阅
当client和server之间断开连接之后,所有发往这个主题的消息都会保留下来,等client重新连接之后,会重新发给该client
目开源的MQTT服务,主要是单机版的MQTT服务,Mosquitto,Moquette,Apollo,RabbitMQ。
物联网场景下的数据一致性
如果所有client发送的数据需要全局一致性,那么必然会需要一个broker来担当master,为每一个消息分配一个id,那么这个Broker会成为一个hotspot,而且系统不具有扩展性。在百度的应用场景中,并没有保证多个client的全局消息一致性。只支持同一个client消息的有序性,通过消息的到达时间来决定其顺序。
MQTT协议的局限性及解决方法
在消息数量级很大时,消息订阅者在一条连接上,会消费所有数据,这是不合理的。
百度使用Kafka,先对消息做分区处理,根据用户提供不同的key,将不同的key的消息存放到不同的分区。在后面的Consumer Group对消息进行消费。