跳至正文

如何构建物联网平台(二)

如何构建物联网平台(二)

通过上一篇构建物联网平台的介绍,我们知道物联网平台离不开数据,没有数据支撑,它无异于空中楼阁。其实,它也离不开数据的”流动”,没有如水般进行数据的输送,数据无法到达它应拥有的舞台,数据这块金子,可能就不会”发光”。因此,构建物联网平台必须有这么一个角色,它专门负责将采集的数据”流动”到指定的目的地,我们可称之为”传输子系统”。

传输子系统是一个”幕后工作者”,即它大多数作为一个后台服务程序,没有界面,默默无闻又任劳任怨,但它的作用却不可小觑。传输子系统说起来也很简单,就是”传个数据”,但实际想构建一个稳定可靠的传输子系统,你可能需要一两年的时间,还不一定做好😓。网络不好,时断时续,该如何传?文件该如何传?传输过程中数据安全如何保证?实时数据和历史数据该如何区分优先级传?多客户端并发传如何保证并发量?一个客户端如何向多个目的地传不同的数据?等等一系列问题都需要解决好。我们认为,构建出一个好的传输子系统,需要至少做到四点:实时、海量 、稳定、安全。你仅仅是”能把数据传过去”的传输系统–———我不是针对你,而是在座的各位的所有达不到这四点要求的传输系统———都是乐色(出自周星驰之《破坏之王》)。

一、实时。实时性是传输子系统的一个重要指标,不具备良好的实时性的传输系统,不能准确传递有效的信息。实时指的是从客户端(client)传输到服务器端(server)的效果是所见即所得、即时的。一条数据,从采集子系统采集上来,到是否第一时间将其进行传输,这就需要实时;数据从客户端发送出去,到服务器端是否接收成功、是否插入数据库成功,使用者往往非常关心,想尽快知道结果,这就是需要的实时。达到实时的要求,很容易想到采集一条数据,就发送一条数据,然后反馈一条结果,然后再发送下一条数据,再等待反馈,这样一来一回很消耗网络资源,如果网络有延迟,数据产生的快,则很容易造成数据阻塞,导致服务器端接收到的数据,永远是”一个小时之前”的数据,毫无实时性可言,也没有使用价值。达到实时性的要求,我们的做法是这样的:首先,将数据分为实时数据和历史数据,进行优先级的划分,实时数据具备高优先级,历史数据则具备低优先级。在传输数据的时候,提供两个队列:实时数据队列和历史数据队列,传输数据的时候,优先传输实时队列的数据;而历史数据则根据带宽情况,有策略的抽取,保证历史数据也能传输过去,而不是永远乱不到历史数据的传输。无论是实时数据还是历史数据,都可以进行批量传输,历史数据大的话,还可进行先整体压缩再传输。
二、海量。海量指的是客户端众多,并发向服务器端传输数据,传输的频率高。这就意味着需要一个高性能的服务器端,完成众多并发客户端的数据发送请求。处理这块内容需要用到网络模型,选择模型,还是事件模型,还是完成端口,epoll等等。当然,要想很好的处理并发,我们选择了boost的asio,它是基于完成端口和epoll的,具备非常优秀的并发处理机制。接收到数据以后,使用线程池这种池化机制进行后期的解析、入库、反馈等操作,极大的提升了服务器端的处理能力。
三、稳定。作为后台服务程序,传输系统必须具备极高的稳定性。实时数据每时每刻都在传输,如果系统不能长时间无间断运行,时不时就崩溃,那么,实时性再好、并发处理能力再强,也只是昙花一现。稳定性需要一定的时间积累,在编码过程中注意理清思路,代码逻辑,分清各个对象的职责,。使用c/c++等需要程序员自己控制内存的语言时,千万注意内存泄漏的问题。
四、安全。数据传输的安全性也很重要,尤其面对注重安全的客户时。安全性的保证除了硬件防火墙,企业内网等的保护外,软件层面也需要注意传输通道和内容的保护。我们使用OpenSSL开源代码来实现SSL协议加密的安全数据传输通道,从而保护传输客户端和服务器端之间数据的安全。在传输的内容上,采用二进制流的方式,即压缩了传输量,又起到了一定的内容保护作用。
当然,还有其他一些质量属性也很重要,例如可拓展性,遇到新的设备,新的数据传输业务场景,需要不更改现有传输协议和流程的前提下,能够灵活的增加传输协议,以适应新的传输要求。我们只是描述了基本的四点,具备了这四点,起码传输子系统能够应用了,可以为物联网平台贡献自己应有的价值了。构建出一个健壮的传输子系统,数据从设备采集过来,就可以流转到他的一个归属地了,另一个重量级的存储子系统该和大家见面了。敬请期待。

asdfasdf