前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >端与云的融合

端与云的融合

作者头像
曲奇泡芙
发布于 2019-08-16 08:26:58
发布于 2019-08-16 08:26:58
3.1K0
举报
文章被收录于专栏:曲奇泡芙曲奇泡芙

端、管、云,物联网系统的三个主要构成元素,各自技术在高速发展的同时也在不断的影响着现代物联网系统的设计。

  • 端,我们指终端设备,包含手机,车辆,智能家居设备等与用户直接交互的设备;
  • 管,我们指通讯管道,包含有线/无线网络等连接端与与云,端与端进行数据交换的通道;
  • 云,我们指运行在各地数据中心的远程服务器集群及其提供的服务;

传统端与云在软件设计方面有不同的专注点,端软件设计的重点在于思考在受限的内存和算力下如何优化单机程序;云软件设计的重点是在于如何设计可扩展的分布式计算使用多机来处理大规模的服务请求。

物联网系统里数据的产生者是各式各样的传感器,包含音频,摄像头视频,加速度传感器,温湿度传感器等。这些每时每刻都在自动产生的传感器数据,相对于移动互联网应用中用户在APP上手动交互而产生的数据会大上几个数量级。庞大的传感器数据量使得将所有原始数据传回云端处理非常困难,对终端算力和通讯管道的提速提出了要求。

近几年来终端算力的提升,使得我们可以把更多的计算放在终端设备,只与云端交换处理后的中间或结果数据,减少与云端原始数据交换。一方面减少了服务响应延时,另一方面也可以规避一些隐私数据的传输。终端算力的提升,越来越多的云端技术可以被引入到终端中。现代汽车电子中,整车电子系统发展趋向于由娱乐域和驾驶域等若干高性能计算机构成,高性能计算机之间通过以太网通讯形成了一个车载的分布式系统,一些原来在云端被验证的分布式技术开始被应用到车内。

另一方面,通讯管道的发展,4G网络的普及和即将到来的超10Gbps的理论传输速度的5G网络使得端与云的分工也在不断发生着变化。管道的提速,端与云之间可以有更高频的近实时数据交互。

端云融合在车联网的场景下, 车作为一个高复杂度的终端,与云之间也有着不断融合的趋势。车载以太网主干和5G的发展促使车与云融合的过程中会产生了一些新的设计思路,这里讨论一种车联网的整车软件架构,我们称之为C/S/ES(Client-Server-EmbeddedServer)架构,如下图。

C/S/ES架构在传统的C/S(客户端/服务器)架构中在逻辑上引入了车内嵌入式服务器ES(Embedded Server)的模块,将车内的计算与人机交互界面分离,把原来一部分在车载客户端的计算逻辑移到了ES模块中。实际部署中客户端软件和ES可以是运行在同一个硬件模块上也可以是运行在不同的硬件模块上,e.g., 通过虚拟化技术来运行多个操作系统。

类似云服务的架构,ES在车内可以采用面向服务或者微服务的架构进行设计。ES中运行的服务动态注册到车内配置中心可以被依赖的服务和客户端发现。类似的,我们可以有一个代理程序将云端提供给车的服务注册到车内配置中心。

ES中支持的服务可以为车载客户端程序提供部分与云端一样的接口。另外,ES中的软件也可以被OTA更新。Android的Background Service一定程度上可以实现部分ES类似的概念,基于独立Linux系统的ES可以为车内多个域同时提供服务而不强耦合于娱乐域,另一方面也可以使用更多跟云服务器相似的一些基于Linux的技术

这种C/S/ES的架构带来了几个好处:

  • 轻客户端APP设计:功能的实现被抽象成服务在ES实现以接口的方式提供出来,APP应用专注于HMI逻辑的实现,根据不同应用的需求可以采用原生/H5的方式来实现UI/UX交互
  • 集中的计算支持多端复用:由于计算逻辑被集中到服务以接口的方式提供出来,而不强耦合与某个车载APP,使得服务能被更多的地方所复用。比如ES中实现的车载自诊断服务可以为云端提供远程诊断的接口,同样也可以为中控和仪表提供本地诊断信息的接口。比如连接在ES中的行车记录仪可以提供视频流服务给中控应用显示,也可以上传到视频云供手机端观看。
  • 冗余ES模块实现功能的高可用:在车联网的场景下,车与云端服务通过蜂窝网络进行通讯,在隧道,地下车库或者偏远地区,我们经常会遇到蜂窝网络失效的情况。对于部分需要保持高可用的功能,我们希望即使在断网的情况下也能够在车内提供服务。比如车载智能语音助手,充电路径规划等。这个例子中我们可以通过将云端同样接口的服务在ES中有个相同或者简化的实现来提供服务。得益于动态服务发现,客户端不需要区分服务的实现者是在车内还是云端,只需要并行向多个冗余的服务提供方发送同样的服务请求即可。

C/S/ES架构并不适用于所有类型的客户端应用,比较适用于分离到ES的服务有以下几类:

  • 数据服务,如用户账号数据管理,车辆状态数据;
  • 算法服务,如语音对话模型运算、启发式路径规划算法等;
  • 控制接口,如门窗,后备箱开关控制等;

事实上,设备本地实现嵌入式服务器的设计在互联网中非常常见——现在每家每户都有的无线路由器管理界面便是以嵌入式Web Server的方式为设备功能管理提供接口。

过去几年,嵌入式服务器软件的开发也在逐步增加。对于运算能力和内存相对较强的平台,选择运行在linux上的golang或者python语言来开发ES服务是个不错的选择。对于资源比较受限的SoC和MCU,Cesanta公司的Mongoose套件提供了一个嵌入式Web Server的C语言开源实现(商业协议或GPL v.2协议),事实上它提供了HTTP/WebSocket/MQTT/CoAP/DNS等在嵌入式环境下多网络协议的支持,支持Linux/QNX/Android/FreeRTOS等多个不同的嵌入式系统,开发者仅需要集成两个源代码文件即可使用。Mongoose也提供了一个裁剪的javascript引擎mJS以支持javascript脚本的一个特性子集。

CivetWeb从Mongoose早期使用MIT协议的版本fork出来发展而成,基于MIT开源协议,提供与Mongoose类似的网络协议支持。CivetWeb集成了Lua脚本引擎以支持服务端动态页面的开发,支持服务端javascript(基于Duktape库,一个嵌入式javascript引擎),以及CGI+SQLite数据库

RealTimeLogic的Barracuda Application Server是另一个使能IOT设备开放web访问接口的产品。开发者可以基于Barracuda开发CSP(C Server Page)和LSP(Lua Server Page)。

随着车载SoC芯片的算力的不断提升和车载以太网技术的普及,未来车型的整车电子在逐步形成车内服务器的架构形态。在这个过程中会涌现大量的,针对车载嵌入式环境设计的分布式系统软件,类似于云计算技术的发展,这些系统软件更多属于平台性质的软件,并不局限于服务某一家整车厂的特定需求,更多的会在Tier 1/Tier 2供应商中产生。

End

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 曲奇泡芙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JDK源码分析-ArrayList分析
花了两个晚上的时间研究了一下ArrayList的源码, ArrayList 继承自AbstractList 并且实现了List, RandomAccess, Cloneable, Serializable 通过实现这三个接口 就具备了他们的功能 RandomAccess 用来表明其支持快速(通常是固定时间)随机访问 Cloneable可以克隆对象 Serializable 对象序列化就是把一个对象变为二进制的数据流的一种方法,通过对象序列化可以方便地实现对象的传输和存储,Seriali
汤高
2018/01/11
1.6K0
JDK源码分析-ArrayList分析
ArrayList源码解析(JDK1.8)
1 package java.util; 2 3 import sun.misc.SharedSecrets; 4 5 import java.util.function.Consumer; 6 import java.util.function.Predicate; 7 import java.util.function.UnaryOperator; 8 9 10 /** 11 * 概述: 12 * List接口可调整大小的数组
武培轩
2018/04/18
8760
Java ArrayList源码分析,带你拿下面试官(含扩容机制等重点问题分析)
这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解。所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项目,专注 Java 后端面试题 + 解析 + 重点知识详解 + 精选文章的开源项目,希望它能伴随你我一直进步!
BWH_Steven
2021/02/24
1.7K1
Java ArrayList源码分析,带你拿下面试官(含扩容机制等重点问题分析)
java集合【7】-- List接口源码解析
java.util.List 接口继承于 Collection 接口,与Map最大的不同之处,在于它属于单列集合,相当于一个列表,有以下这些特点:
秦怀杂货店
2020/11/21
6460
java集合【7】-- List接口源码解析
java集合【9】-- Vector接口源码解析
Vector和前面说的ArrayList很是类似,这里说的也是1.8版本,它是一个队列,但是本质上底层也是数组实现的。同样继承AbstractList,实现了List,RandomAcess,Cloneable, java.io.Serializable接口。具有以下特点:
秦怀杂货店
2020/11/22
4830
java集合【9】-- Vector接口源码解析
ArrayList源码完全分析
本文介绍了Java中的ArrayList类,它是Java编程语言中最常用的集合类之一。ArrayList用于存储一系列元素,允许添加、删除和随机访问元素。ArrayList的底层实现是数组,它通过ArrayList的实例变量来存储元素。在ArrayList中,添加、删除和随机访问元素的时间复杂度分别是O(1)、O(1)和O(1)。ArrayList的常用方法有add、remove、set、get、size、iterator、listIterator等。同时,文章还对ArrayList的性能、容量预估、扩容、元素访问顺序等方面进行了详细阐述。
MelonTeam
2018/01/04
9670
JDK1.8源码(五)——java.util.ArrayList 类
  关于 JDK 的集合类的整体介绍可以看这张图,本篇博客我们不系统的介绍整个集合的构造,重点是介绍 ArrayList 类是如何实现的。 1、ArrayList 定义 ArrayList 是一个用
IT可乐
2018/03/30
1.1K0
JDK1.8源码(五)——java.util.ArrayList 类
ArrayList 分析以及相关方法介绍
java.util.ArrayList 是我们最常用的一个类,ArrayList 底层是动态数组,读者可以把它理解为数组的实现
cxuan
2019/06/03
5080
List源码解析
开始看一下集合Collection,List是Collection的一个子接口,其是很常用的,主要是看一下其下的几个类。
Liusy
2020/09/01
3850
List源码解析
彻底搞懂ArrayList
同样是空的数组对象,和EMPTY_ELEMENTDATA区别在于,无参构造函数的空数组会用DEFAULTCAPACITY_EMPTY_ELEMENTDATA赋值,有参构造函数的空数组会用EMPTY_ELEMENTDATA赋值。
每天学Java
2020/09/18
4470
Java 集合深入理解(12):古老的 Vector
该文章讲述了Java 的 Vector 类,包括其历史、使用场景、底层实现、与其他类的关系、底层类的结构、构造函数、常用方法、与 ArrayList 的区别、Vector 的性能、与 Collections 工具类的关系、以及其类图。此外,该文还提供了与 JDK 1.0 和 JDK 1.1 中 Vector 的对比,以及 Vector 的常用且效率较高的方法。
张拭心 shixinzhang
2018/01/05
8340
Java 集合深入理解(12):古老的 Vector
Java面试题之List(一)
我们都知道,Java面试中避免不了的要涉及到对各种框架和源码的盘问。有的面试官会直接点,问我们对ArrayList的源码的理解,有的会间接的提问。
黑洞代码
2021/01/14
4310
ArrayList源码学习
重点了解:数组为EMPTY_ELEMENTDATA就走基于用户设置大小值进行1.5倍扩容(这里是空所以是0),数组为默认空DEFAULTCAPACITY_EMPTY_ELEMENTDATA就会走基于默认值的大小10扩容进行1.5倍扩容
晓果冻
2022/09/08
3800
ArrayList源码学习
Java集合--List
Java集合 作为一个Developer,Java集合类是我们在工作中运用最多的、最频繁的类。相比于数组(Array)来说,集合类的长度可变,更加适合于现代开发需求; Java集合就像一个容器,可以存储任何类型的数据,也可以结合泛型来存储具体的类型对象。在程序运行时,Java集合可以动态的进行扩展,随着元素的增加而扩大。在Java中,集合类通常存在于java.util包中。 Java集合主要由2大体系构成,分别是Collection体系和Map体系,其中Collection和Map分别是2大体系中的顶层接口
贾博岩
2018/05/11
3K0
【Java入门提高篇】Day21 容器类详解(四)ArrayList源码分析
   今天要介绍的是List接口中最常用的实现类——ArrayList,本篇的源码分析基于JDK8,如果有不一致的地方,可先切换到JDK8后再进行操作。
弗兰克的猫
2018/06/03
7370
【Java入门提高篇】Day21 容器类详解(四)ArrayList源码分析
ArrayList详解
ArrayList 是一个数组列表。它的主要底层实现是Object数组,但与 Java 中的数组相比,它的容量能动态变化,可看作是一个动态数组结构。特别注意的是,当我们装载的是基本类型的数据 int,long,boolean,short,byte… 的时候,我们只能存储他们对应的包装类。
程序员阿杜
2023/08/25
2410
ArrayList的实现原理浅析
查看ArrayList的源码,发现其继承自AbstractList,实现了List,RandomAccess,Cloneable以及Serializable接口,如:
孟君
2020/04/22
4790
Java-集合
哈喽!大家好,我是小简。今天开始学习《Java-集合》,此系列是我做的一个 “Java 从 0 到 1 ” 实验,给自己一年左右时间,按照我自己总结的 Java-学习路线,从 0 开始学 Java 知识,并不定期更新所学笔记,期待一年后的蜕变吧!<有同样想法的小伙伴,可以联系我一起交流学习哦!>
小简
2023/01/04
1.2K0
Java-集合
java进阶|Vector源码分析和理解
这一篇文章算是从java基础性文章结束到进阶的一个过渡,虽然自己从未使用过Vector这样的容器进行数据的增删改查操作,但还是按照一贯的思路进行分析一下它的源码。
码农王同学
2020/04/08
3470
java进阶|Vector源码分析和理解
ArrayList源码解析,老哥,来一起复习一哈?
JDK源码解析系列文章,都是基于JDK8分析的,虽然JDK14已经出来,但是JDK8我还不会,我…
敖丙
2020/05/26
6390
ArrayList源码解析,老哥,来一起复习一哈?
相关推荐
JDK源码分析-ArrayList分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文