目录
- 1 基于Thrift的RPC框架的开发和维护
-
- 项目介绍
- RPC及实现RPC需要的技术
-
- 1 动态代理
- 2 序列化和反序列化
- 3 NIO通信组件
- 4 注册中心
- 为什么使用RPC
-
- Thrift简介
- Thrift整体架构
- Thrift 三大重要组件:Transport、Protocol和 Server
-
- 传输方式Transport
- 传输协议Protocol(编码方式)
-
- 服务模型Server(Java)
-
- 1 TSimpleServer模式
- 2 TNonblockingServer模式
- 3 THsHaServer模式(半同步半异步)
- 4 TThreadPoolServer模式
- 5 TThreadedSelectorServer模式
- 服务模型Server(Python)
-
- 1 TSimpleServer
- 2 TThreadPoolServer
- 2 数仓
-
- 数据仓库概念
- 数仓分层概念
- 数据仓库的输入数据源和输出系统
- 维、维度、维度表和事实表
-
- 0 来自知乎的一个简单解释
- 1 维
- 2 维度
- 3 维度表
- 4 事实表
- 5 星型模式结构示意图
- 数据湖 VS 数据仓库
-
- 1 本质区别
- 2 存储位置
- 3 数据源
- 4 用户
- 5 数据质量
- 6 数据模式
- 7 敏捷扩展性
- 8 应用
- 2 基于Spring Boot的个人博客系统
-
- 3 基于Servlet和JSP的网上书城
-
- 0 项目介绍
- 1 什么是Servlet
- 2 Tomcat容器等级
- 3 手工编写一个Servlet
- 4 测试题
- 5 Servlet执行流程
- 6 Servlet生命周期
- 7 Tomcat装载Servlet的三种情况
- 8 Servlet与JSP的区别
- 9 Spring MVC和Servlet
- 10 转发和重定向的区别
- Servlet是线程安全的吗?
- 4 僵尸企业画像及分类
- 5 降低汽油精制过程中的辛烷值损失模型
- 6 天然气股份有限公司场站智能化分析及控制软件开发
-
1 基于Thrift的RPC框架的开发和维护
项目介绍
公司项目整体架构是基于分布式的:以Java集成各功能模块作为客户端,以Python提供机器学习算法支持作为服务端,以RPC保证高效稳定通信。Thrift作为一种典型的CS结构,且支持跨语言,故以此进行RPC开发。在Thrift的技术选型上,使用TFramedTransport作为传输方式、TCompactProtocol作为传输协议(编码方式),TForkingServer作为服务模型;同时,为了保证服务的稳定性,客户端启用一个心跳机制来维护长连接,服务端建立一个管理进程监测维护各服务进程。
分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。
RPC及实现RPC需要的技术
- RPC(Remote Procedure Call Protocol,远程过程调用协议):是一种通过网络从远程服务器上请求服务,而不需要了解底层网络技术的协议;RPC使得客户端在远程调用时,能够像本地调用一样方便,而感知不到远程调用的逻辑;
- 关键技术包括:通信协议、序列化、接口描述、服务框架、性能和语言支持等;
- RPC可以使用TCP作为传输协议,也可以使用HTTP(如gRPC),但一般都是TCP;
- RPC = socket + 动态代理
动态代理发生在服务调用方,RPC 框架需要解决的是:像调用本地接口一样调用远程接口。于是如何组装数据报文、如何经过网络传输发送至服务提供方,以及如何屏蔽远程接口调用的细节,便是动态代理需要做的工作。
1 动态代理
- 动态代理用于生成客户端存根、服务端存根,当调用 RPC 远程接口时,实际是调用了它的代理类,再由代理类使用 Socket 技术向远程接口发送请求信息;
- 一般这个代理过程可以使用 JDK 提供的原生代理方式,也可以使用开源的 CGLib 代理;
一个完整的RPC架构包含5个核心组件,分别是:客户端、客户端存根、网络传输模块、服务端存根、服务端:
- 客户端(Client):服务调用方;
- 客户端存根(Client Stub):存放服务端的地址信息,将客户端的请求参数打包成网络消息,再通过网络传输发送给服务方;
- 网络传输模块(Network Service):底层传输,可以是TCP或HTTP;
- 服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理;
- 服务端(Server):服务的真正提供者;
2 序列化和反序列化
- 在网络信息传输中,所有数据都会被转换为字节码进行传送;
- RPC在调用的过程中,需要把接口的入参和出参通过序列化转化成字节码和反序列化为对象,也就是编码和解码操作;
- 比较常用的开源的序列化方式有JSON、Protobuf等,当然也可以用Java自带的序列化方式,但这个过程非常耗时,所以一般不会使用;
3 NIO通信组件
- 在RPC通信实现方案中,需要考虑并发性能问题,非常重要的一环是需要考虑I/O的选择。传统阻塞式的IO显然是不合适的,因此需要非阻塞IO,即NIO;
- 但实现NIO通信比较复杂,也容易出错,所以在RPC通信中一般都会选择Netty作为NIO的通信组件;
4 注册中心
- 在 NIO 的通信中,接口提供方需要把接口注册到一个中心,在接口调用方调用服务时,需要从注册中心获取接口的提供方,其中最核心的信息就是IP+端口号;
- 拿到提供方信息后进行 socket 连接操作,接下来就可以通信了;
- 注册中心通常会选择ZooKeeper,但也可以使用其他方式,如Redis;
- 注册中心可以缺失,如果接口调用方知道接口提供方的IP+端口号,就可以直接调用,而不需要向注册中心去查询。直接调用的优点就是直接且易于维护,缺点则是不够灵活,如果服务的地址改变了,我们需要手动修改服务提供的地址,而不能动态地实时地去获取;
为什么使用RPC
RPC要解决的两个问题:
- 解决分布式系统中,服务之间的调用问题。
- 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。
RPC和HTTP
- HTTP是RPC的一种;
- HTTP是在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期使用的一种通信手段,接口可能返回一个JSON字符串或XML文档,然后客户端再去处理这个返回的信息。优点就是简单直接、开发方便;
- 如果一个系统内部子系统较多、接口非常多,RPC框架的优势就显示出来了:1 RPC用到了动态代理模式,能解耦服务;2 RPC调用是面向服务的封装,针对服务的可用性和效率等都做了优化(传输方式、传输协议、服务模型等),单纯使用HTTP调用则缺少了这些特性;3 RPC框架一般都有注册中心,有丰富的监控管理、发布和下线接口等;4 长连接:不必每次通信都要像HTTP一样去3次握手,减少了网络开销;
Thrift简介
- Thrift是用于实现RPC通信的一种框架,支持跨语言,包括C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml, Delphi等;
- Thrift是一种典型的CS(客户端/服务端)结构,客户端和服务端可以使用不同的语言开发。既然客户端和服务端能使用不同的语言开发,就一定要有一种中间语言来关联客户端和服务端的语言,这种语言就是IDL(Interface Description Language);
Thrift整体架构
- 业务逻辑层是用户实现的业务逻辑;
- 代码框架层是根据Thrift定义的服务接口描述文件生成的客户端和服务器端代码框架;
- 数据读写操作层是根据Thrift文件生成代码实现数据的读写操作;
- 以下是Thrift的传输协议、传输方式以及底层的IO通信,使用Thrift可以很方便地定义一个服务并且选择不同的传输协议和传输方式;
Thrift 三大重要组件:Transport、Protocol和 Server
传输方式Transport
- TSocket:阻塞型socket,用于客户端,采用系统函数read和write进行读写数据;
- TNonblockingServerSocket:非阻塞型socket,用于服务端,accept到的socket类型都是TSocket;
- TBufferedTransport和TFramedTransport:非阻塞有缓存,均继承TBufferBase,调用下一层TTransport类进行读写操作,结构非常相似。但TFramedTransport以帧为传输单位,帧结构为:4字节+传输字符串,4字节用来存储传输字符串的长度,该字符串才是真正需要传输的数据,因此TFramedTransport每传一帧都要比TBufferedTransport和TSocket多传4字节;
- TFileTransport:以文件形式进行传输;
传输协议Protocol(编码方式)
Thrift传输协议总体上可划分为二进制(binary)和文本(text)传输协议两大类,一般在生产环境中使用二进制类型的传输协议(相比于文本和JSON传输效率更高)。
- TBinaryProtocol:使用二进制编码格式进行数据传输,Thrift的默认协议;
- TCompactProtocol:压缩的二进制编码格式,使用高效率的、密集的二进制编码格式进行数据传输;
- TJSONProtocol:使用JSON数据编码格式进行数据传输,在网络中以文本方式传输,易于抓包分析和理解;
- TDebugProtocol:使用text编码格式进行数据传输,可读性强,常用于编码人员测试;
二进制协议 VS 文本协议
- 二进制协议:没有冗余字段、传输高效、方便解析(固定长度,并且可以直接比较字节),缺点就是定义的比较死,哪个位置有哪些东西,是什么意义都是定义死的,场景单一;
- 文本协议:直观、描述性强、容易理解、便于调试,缺点就是冗余数据较多,不适宜传输二进制文件(如图片等),解析复杂(需要进行字符串比较);
- 应用场景:1 高效传输和数据安全,使用二进制协议;2 便于调试和命令较少(如即时通讯软件),使用文本协议;
服务模型Server(Java)
1 TSimpleServer模式
- TSimpleServer的工作模式下只有一个工作线程,循环监听新请求的到来并完成对请求的处理,它只是在简单的演示时候使用;
- TSimpleServer的工作模式采用最简单的阻塞IO,实现方法简洁明了,便于理解,但是一次只能接收和处理一个socket连接,效率比较低,主要用于演示Thrift的工作过程,在实际开发过程中很少用到它。
2 TNonblockingServer模式
TNonblockingServer也是单线程工作,但是该模式采用NIO的方式,所有的socket都被注册到selector中,在一个线程中通过selector循环监听所有的socket;每次selector结束时,处理所有的处于就绪状态的socket:对于监听到的socket产生一个新业务socket并将其注册到selector中,对于有数据到来的socket进行数据读取操作,对于有数据发送的socket进行数据发送操作。
TNonblockingServer模式优点:
相比于TSimpleServer效率提升主要体现在IO多路复用上,TNonblockingServer采用非阻塞IO,同时监控多个socket的状态变化。
TNonblockingServer模式缺点:
TNonblockingServer模式在业务处理上还是采用单线程顺序来完成,在业务处理比较复杂、耗时的时候,例如某些接口函数需要读取数据库执行时间较长,此时该模式效率也不高,因为多个调用请求任务依然是一个接一个顺序执行。
3 THsHaServer模式(半同步半异步)
THsHaServer类是TNonblockingServer类的子类,TNonblockingServer模式中,采用一个线程来完成对所有socket的监听和业务处理,造成了效率的低下,THsHaServer模式的引入则是部分解决了这些问题。THsHaServer模式中,引入一个线程池来专门进行业务处理。
THsHaServer的优点:
与TNonblockingServer模式相比,THsHaServer在完成数据读取之后,将业务处理过程交由一个线程池来完成,主线程直接返回进行下一次循环操作,效率大大提升。
THsHaServer的缺点:
主线程需要完成对所有socket的监听以及数据读写的工作,当并发请求数较多,且发送数据量较大时,监听socket上新连接请求不能被及时接收。
4 TThreadPoolServer模式
TThreadPoolServer模式采用阻塞socket方式工作,主线程负责阻塞式监听是否有新socket到来,业务处理交由一个线程池来处理。
TThreadPoolServer模式优点:
线程池模式中,数据读取和业务处理都交由线程池完成,主线程只负责监听新连接,因此在并发量较大时新连接也能够被及时接收。线程池模式比较适合服务器端能预知最多有多少个客户端并发的情况,这时每个请求都能被业务线程池及时处理,性能也非常高。
TThreadPoolServer模式缺点:
线程池模式的处理能力受限于线程池的工作能力,当并发请求数大于线程池中的线程数时,新请求也只能排队等待。
5 TThreadedSelectorServer模式
TThreadedSelectorServer模式是目前Thrift提供的最高级的模式,它内部有如下几个部分构成:
- 一个AcceptThread线程对象,专门用于处理监听socket上的新连接;
- 若干个SelectorThread线程对象专门用于处理业务socket的网络I/O操作,所有网络数据的读写均是由这些线程来完成;
- 一个负载均衡器SelectorThreadLoadBalancer对象,主要用于AcceptThread线程接收到一个新socket连接请求时,决定将这个新连接请求分配给哪个SelectorThread线程;
- 一个ExecutorService类型的工作线程池,在SelectorThread线程中,监听到业务socket中有调用请求过来,则将请求读取之后,交给ExecutorService线程池中的线程完成此次调用的具体执行;
TThreadedSelectorServer模式中有一个专门的线程AcceptThread用于处理新连接请求,因此能够及时响应大量并发连接请求;另外它将网络I/O操作分散到多个SelectorThread线程中来完成,因此能够快速对网络I/O进行读写操作,能够很好地应对网络I/O较多的情况;TThreadedSelectorServer对于大部分应用场景性能都不会差,因此,如果实在不知道选择哪种工作模式,使用TThreadedSelectorServer就可以。
链接: Python服务端源码解析.
服务模型Server(Python)
1 TSimpleServer
TSimpleServer的工作模式采用最简单的阻塞IO,实现方法简洁明了,便于理解,但是一次只能接收和处理一个socket连接,效率比较低。
源码分析
- 设置TServerSocket的listen()方法启动连接监听;
- 以阻塞的方式接受客户端的连接请求,每进入一个连接即为其创建一个TSocket对象(封装socket连接);
- 为客户端创建输入传输通道对象、输出传输通道对象、输入协议对象和输出协议对象;
- processor对象为服务模型创建之前创建的,用来处理具体的业务请求;
2 TThreadPoolServer
服务启动时先创建好self.threads个线程,每个线程负责从队列clients中获取客户端连接TSocket对象。而主线程负责accept客户端的连接并创建TSocket对象,放入clients队列。
3 TNonblockingServer
类似于Java版Thrift中的THsHaServer,思路是服务启动时创建threads个线程负责处理task队列中的任务消息。而主线程利用I/O多路复用技术将准备好的可读消息放入task队列供业务线程处理,同时在处理结束后可写时直接将结果返回给客户端。
4 TForkingServer VS TProcessPoolServer
- 由于Python的GIL锁,所以Python没有真正的多线程,无法实现并行运作,多任务场景下效率低下,因此引入了两个多进程模型;
- 其中TForkingServer,服务端每次监听到client请求,会os.fork一个子进程进行业务处理;
- TProcessPoolServer服务启动时创建指定个数的进程;
2 数仓
数据仓库概念
1 概念
- 数据仓库(Data Warehouse)通常指一个数据库环境,而不是一件产品,它提供用户用于决策支持的当前的和历史数据,这些数据在传统的数据库中通常不方便得到;
- 数据仓库是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合;
- 通常用于辅助决策支持;
2 特点
2.1 面向主题
- 操作型数据库中的数据针对事务处理任务,各个业务系统之间彼此分离,而数据仓库中的数据按照一定的主题域进行组织;
- 主题是个抽象概念,指用户使用数据仓库进行决策时所关心的重点领域,如顾客/供应商/产品等;
- 一个主题通常与多个操作型数据库相关;
2.2 集成
- 操作型数据库通常与某些特定的应用相关,数据库之间相互独立,且往往是异构的;
- 而数据仓库中的数据是在原有分散的数据库数据作抽取、清理的基础上经过系统加工、汇总和整理得到的,因此必须消除源数据中的不一致性,以保证数据仓库内的信息是关于整个企事业单位一致的全局信息;
- 即存放在数据仓库中的数据应使用一致的命名规则、格式、编码结构和相关特性来定义;
2.3 相对稳定
- 操作型数据库中的数据通常实时更新,数据根据需要及时发生变化;
- 数据仓库中的数据主要用作决策分析,涉及的数据操作主要是查询和定期更新,一旦某个数据加载到数据仓库以后,一般情况下将作为数据档案长期保存,几乎不再做修改和删除操作;
- 即数据仓库中通常有大量的查询操作及少量定期的更新操作;
2.4 反映历史变化
- 操作型数据库主要关心当前某一时间段内的数据,而数据仓库中的数据通常包含较久远的历史数据;
- 因此数仓中通常包括一个时间维,以便研究趋势和变化;
- 数仓系统通常记录了一个单位从过去某一时期到目前的所有时期的信息,通过这些信息,可以对单位的发展历程和未来趋势作出定量分析和预测;
数据集市则是一种微型的数据仓库,通常有更少的数据,更少的主题区域,更少的历史数据,部门级的,一般只能为某个局部范围内的管理人员服务;
数据仓库是企业级的,能为整个企业各个部门的运行提供决策支持手段;
数仓分层概念
- ods:operation data store原始数据层,数据保持原貌不做处理;
- dwd:data warehouse detail明细数据层,结构和粒度与原始表保持一致,对ods层数据进行清洗(去除空值,脏数据);
- dws:data warehouse service数据服务层,数据轻度汇总;
- ads:application data store 数据应用层,为各种统计报表提供数据;
数仓为什么要分层
- 把复杂问题简单化:把一个复杂的任务分解成多个步骤来完成,每一层只处理单一的步骤,比较简单,并且方便定位问题;
- 减少重复开发:通过中间层数据,能够极大地减少重复计算,增加一次计算结果的复用性;
- 隔离原始数据:使真实数据与统计数据解耦开;
数据仓库的输入数据源和输出系统
- 输入系统:埋点产生的用户行为数据、JavaEE后台产生的业务数据;
- 输出系统:报表系统、用户画像系统、推荐系统;
维、维度、维度表和事实表
0 来自知乎的一个简单解释
1 维
维是关于一个组织想要记录的视角或观点。
参考: 维的百度百科.
2 维度
- 维度是对数据进行分析时采取的一个角度。比如分析产品销售情况,可以按类别来分析,也可以按区域来分析,于是类别和区域就构成了两个维度;
- 每个维度可以有子维度;
3 维度表
- 维度表是对每个维至少使用一个表来存放维的层次、成员类别等维的描述信息;
- 维度表和事实表通过主键和外键联系在一起,形成星型,也称为“星型模式”;
- 对层次复杂的维,为避免冗余数据占用过大的存储空间,可以使用多个表描述,即“雪花型模式”;
- 维度表示例(产品维度表):Prod_ID,Product_Name,Category,Color,Size,Price
特性:
- 记录数少,上千左右;
- 大多是文字信息;
- 信息具有层次结构;
- 只有一个主键;
- 信息可修改;
4 事实表
- 事实表用来存储数据和维关键字,是依据某些维度数据聚合后生成的结果表;
- 事实表示例:
特性:
- 大量数据行,存储TB级;
- 主要是数值,少量文字或多媒体;
- 有和维度表连接的外键;
- 主要是静态数据和聚集数据;
5 星型模式结构示意图
数据湖 VS 数据仓库
1 本质区别
- 数据湖和数据仓库是存储大数据的两种不同策略;
- 最本质的区别是:数据仓库中存储的都是结构化数据,需要提前设计好模式(schema);而数据湖可以存储结构化和非结构化的数据,无法预先定义好结构;
2 存储位置
- 数据仓库要有结构,大部分都是基于关系型模型;
- 而数据湖通常位于分布式存储如Hadoop或类似的大数据存储中;
3 数据源
- 数据仓库的数据很多时候是从OLTP应用的结构化数据库中提取的,用于支持内部的业务部门(销售、市场、运营等)进行业务分析;
- 数据湖的数据来源可以是结构化的,也可以是非结构化的,例如:业务系统数据库、IOT设备、社交媒体、移动APP等;
4 用户
- 数据仓库主要是对业务系统对大量业务数据进行统计分析,所以会应用数据分析的部门是数据仓库的主要用户,例如:销售部、市场部、运营部、总裁办等;
- 数据湖中的数据都是原始数据,是未经整理的,更适合数据科学家,通过应用模型、技术发掘数据中的价值,去解决企业中的业务问题;
5 数据质量
- 数据仓库非常重视数据质量,数据都是经过处理的,像数据中台有很大一块是数据质量管理、数据资产管理等;
- 数据湖中数据可靠性较差,这些数据可能是任意状态、任意形态的数据;
6 数据模式
- 数据仓库在数据写入前就要定义好模式(schema),例如:先建立模型、建立表结构,然后导入数据,我们称之为write-schema;
- 数据湖中的数据没有没有模式,直到用户要访问数据、使用数据才会建立schema,我们称之为read-schema;
7 敏捷扩展性
- 数据仓库的模式一旦建立,如果重新调整模式,往往代价很大,牵一发而动全身,所有相关的ETL程序可能都需要调整;
- 而数据湖非常灵活,可以根据需要重新配置结构或者模式;
8 应用
- 数据仓库一般用于做批处理报告、BI、可视化等;
- 数据湖主要用于机器学习、预测分析、数据探索和分析;
2 基于Spring Boot的个人博客系统
项目介绍
- 项目介绍:个人博客系统包含前台管理和后台管理两部分。前台管理的核心功能包括:文章分页展示、文章详情查看、文章评论管理;后台管理的核心功能包括:系统数据展示、文章发布、文章修改、文章删除;同时,对系统前后台用户登录管理进行了统一实现。
- 软件环境:前端使用Spring Boot支持的模板引擎Thymeleaf+jQuery完成页面信息展示,后端使用Spring MVC+Spring Boot+MyBatis框架进行整合开发。
3 基于Servlet和JSP的网上书城
0 项目介绍
- 项目介绍:网上书城包含面向用户和面向管理员两部分。面向用户的部分包括:首页、用户注册、购物、提交订单、付款等模块;面向管理员的部分包括:图书管理、物流管理等模块。
- 软件环境:Servlet、JSP、Tomcat、MySQL等。
1 什么是Servlet
Servlet是一个Java类,是在服务器上运行以处理客户端请求并作出响应的程序。
2 Tomcat容器等级
Tomcat容器分四个等级,Servlet容器管理Context容器,一个Context对应一个Web工程。
3 手工编写一个Servlet
- 继承HttpServlet;
- 重写doGet()或doPost()方法;
- 在web.xml中注册Servlet;
- 部署运行;
4 测试题
假设在helloapp应用中有一个HelloServlet类,它在 web.xml文件中的配置如下:
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>org.javathinker.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
那么在浏览器端访问HelloServlet的URL是什么?
- 答:http://localhost:8080/helloapp/hello
- 解析:localhost是服务器主机名,也可以是IP地址127.0.0.1;8080是tomcat服务器的端口号;helloapp是web工程的上下文地址ContextRoot(一般情况下与web工程名一致);最后是
标签中的内容。
5 Servlet执行流程
6 Servlet生命周期
- 初始化阶段:调用构造方法创建Servlet实例,然后调用init()方法,在整个生命周期内,init()只被调用一次;
- 响应客户端请求阶段:调用service()方法。由service()方法根据提交方式选择执行doGet()或者doPost()方法;
- 终止阶段:服务器关闭时,调用destroy()方法。在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收;
架构图
下图展示了一个典型的 Servlet 生命周期方案。
- 第一个到达服务器的 HTTP 请求被委派到 Servlet 容器;
- Servlet 容器在调用 service() 方法之前加载 Servlet;
- 然后 Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例的 service() 方法;
7 Tomcat装载Servlet的三种情况
- Servlet容器启动时自动装载某些Servlet,实现它只需要在web.xml中的
之间添加如下代码:1
,数字越小优先级越高;
- Servlet容器启动后,客户端首次向Servlet发送请求;
- Servlet类文件被更新后,会自动重新装载Servlet;
8 Servlet与JSP的区别
- Servlet是一个Java类,是在服务器上运行以处理客户端请求并作出响应的程序;
- JSP是一种动态页面技术,它的主要目的是将表示逻辑从Servlet中分离出来;
- SUN 公司推出 JSP 技术的同时,也推出了两种 Web 应用程序的开发模式。即 JSP+JavaBean 和 Servlet+JSP+JavaBean;
- JSP+JavaBean 中 JSP 用于处理用户请求,JavaBean 用于封装和处理数据。该模式只有视图和模型,一般把控制器的功能交给视图来实现,适合业务流程比较简单的 Web 程序。JSP+JavaBean 模式在一定程度上实现了 MVC,即 JSP 将控制层和视图层合二为一,JavaBean 为模型层;
- Servlet+JSP+JavaBean 中 Servlet 用于处理用户请求,JSP 用于数据显示,JavaBean 用于数据封装,适合复杂的 Web 程序。Servlet+JSP+JavaBean很好地实现了MVC,即Servlet担当控制层,JSP为视图层,JavaBean为模型层;
9 Spring MVC和Servlet
Spring MVC简化了写Servlet类,由一个前端调度器接收所有请求,后台写相应的Controller就好,而Servlet就是一个请求一个映射一个Servlet。
10 转发和重定向的区别
forward(转发)
是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容从哪里来的,因为这个跳转过程是在服务器实现的,并不是在客户端实现的,所以客户端并不知道这个跳转动作,所以它的地址栏还是原来的地址。
redirect(重定向)
是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
转发是服务器行为,重定向是客户端行为。
区别:
-
从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址;
redirect是服务端根据逻辑发送一个状态码,告诉浏览器重新去请求某个地址.,所以地址栏显示的是新的URL;
-
从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据;
redirect:不能共享数据;
-
从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块;
redirect:一般用于用户注销登陆时返回主页面和跳转到其它网站等;
- 从效率来说
forward:高;
redirect:低;
Servlet是线程安全的吗?
Servlet不是线程安全的,多线程的读写会导致数据不同步的问题。
4 僵尸企业画像及分类
- 僵尸企业是指缺乏盈利能力却能够以低于市场最优利率成本获得信贷资源,依靠外界输血而缺乏自生能力的企业。僵尸企业是我国经济结构转型时期面临的一个棘手问题,既影响经济效率,也蕴含金融风险,处理这一问题首先需要对僵尸企业进行识别和分类;
- 项目最终目标是要实现单个企业画像和批量企业画像的功能。单个画像模块主要描述对单个企业画像信息的特征数据进行分析;批量画像模块是在单个画像的基础上进行的,用户通过将批量数据导入系统中,然后进行批量数据分析;
- 画像算法采用了PCA+XGBoost算法。通过PCA(主成分分析)得到了特征项;接着,将根据特征项重新整理的数据放入XGBoost模型中进行训练,不断调整参数,使得验证集有一个比较高的准确率;
5 降低汽油精制过程中的辛烷值损失模型
- 辛烷值是反映汽油燃烧性能的最重要指标,现有技术在对催化裂化汽油进行脱硫和降烯烃过程中,普遍降低了汽油辛烷值。辛烷值每降低1个单位,相当于损失约150元/吨。由于炼油工艺过程的复杂性以及设备的多样性,它们的操作变量繁多(数百个)且之间具有高度非线性和相互强耦联的关系,因此考虑用非线性的机器学习算法模型来建模;
- 方案主要利用了机器学习技术来解决化工过程建模问题,先通过PCA降维寻找影响辛烷值损失值的最重要的30个变量,然后建立基于XGBoost的辛烷值损失预测模型,从而为汽油化学工艺提供参考;
6 天然气股份有限公司场站智能化分析及控制软件开发
异常检测研发目标
故障检测系统将从以下几个方面为天然气储运场站的生产和储运提供技术支持:
(1)对场站安全态势进行全方位刻画。目前,公司对场站的各种设备进行了实时检测,在生产过程中利用计算机控制系统收集了计量设备、分离设备和压缩机组等生产设备的运行状态,故障检测系统将对这些数据进行清洗、挖掘和分析,以实现对场站安全态势的全方位刻画;
(2)对场站安全态势进行预测。天然气场站的储运数据具有动态性、非线性和随机性等复杂特性,故障检测系统将结合机器学习、过程检测等技术对数据进行科学建模,预测可能出现的故障;
(3)降低场站事故发生率。在对安全态势合理预测的基础上,预知可能出现的故障,及时检查清除故障,保证天然气生产和储运的平稳运行,降低因天然气运行设备老化、损坏、维护不及时等原因造成的事故发生率。
异常检测设计方案
异常检测系统的主要功能在于高效评价设备运行工况,预先发现运行故障,快速定位故障原因,为提高场站生产管理的安全级别提供决策依据。设计方案主要结合了机器学习、大数据管理、过程检测等技术,此外还参考了天然气领域的相关知识。
具体来说,就是对单个传感器得到的数据和多个传感器得到的数据采用不同的模型进行处理。其中,使用LSTM模型对单点数据进行处理,判断该变量是否产生故障;使用BP神经网络对多点支路数据进行故障检测,判断该多点支路是否有故障产生。
单点检测
单点是指单个传感器检测点,单点异常检测实际上是对一维时间序列上的异常点进行检测。
由于天然气数据不是一个纯粹的随机时间序列,它的时间序列可能存在某种长期依赖关系,而LSTM模型可以捕捉到这种长期依赖关系,因此考虑建立LSTM模型进行天然气数据的单点故障检测。
LSTM,即长短期记忆网络,是为了解决一般的RNN(循环神经网络)存在的长期依赖问题而专门设计出来的,适合于处理和预测时间序列中间隔和延迟非常长的重要事件。
(1)数据预处理
- 首先从CSV文件中提取出需要进行异常检测的一维时间序列,然后对数据进行z-score标准化,即0均值标准化,将数据变换为均值为0、标准差为1的标准正态分布。
(2)划分训练集、验证集和测试集
- 将处理后的数据按照7:2:1的比例将数据划分为训练集、验证集和测试集。
(3)设定模型参数
(4)训练模型
- 将处理后的数据加载到pandas的数据框架中,它将输出 ( N, W, F ) 三维numpy数组,其中N表示训练数据中的序列数,W表示序列长度,F表示每个序列的特征数;然后将数组馈送进LSTM模型中。
(5)通过模型进行预测
- LSTM模型使用训练集数据的第一部分(滑动窗口大小)初始化一次训练窗口,预测出单个点的值,然后不断移动滑动窗口去预测下一个点的值。以此类推,LSTM模型可以预测出一个完整的时间序列。
(6)异常检测与判定
将预测出来的数据和真实的测试集数据进行对比,比较数据的真实值是否在其预测值的三倍标准差内,如果在,则表明该数据为正常数据,否则该数据为异常数据。
多点检测
多点是指多个传感器检测点。
使用BP神经网络做多点故障检测:通过研究实测数据,利用采集的压力、温度及时间点等数据在BP神经网络中进行训练学习和预测评估。