目录
- 1 基于Thrift的RPC框架的开发和维护
-
- 项目介绍
- RPC及实现RPC需要的技术
-
- 1 动态代理
- 2 序列化和反序列化
- 3 NIO通信组件
- 4 注册中心
- 为什么使用RPC
-
- RPC和HTTP
- Thrift简介
- Thrift整体架构
- Thrift 三大重要组件:Transport、Protocol和 Server
-
- 传输方式Transport
- 传输协议Protocol(编码方式)
-
- 二进制协议 VS 文本协议
- 服务模型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是线程安全的吗/li>
- 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 框架需要解决的是:像调用本地接口一样调用远程接口。于是如何组装数据 文、如何经过 络传输发送至服务提供方,以及如何屏蔽远程接口调用的细节,便是动态代理需要做的工作。
一个完整的RPC架构包含5个核心组件,分别是:客户端、客户端存根、 络传输模块、服务端存根、服务端:
- 客户端(Client):服务调用方;
- 客户端存根(Client Stub):存放服务端的地址信息,将客户端的请求参数打包成 络消息,再通过 络传输发送给服务方;
- 络传输模块(Network Service):底层传输,可以是TCP或HTTP;
- 服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理;
- HTTP是RPC的一种;
- HTTP是在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期使用的一种通信手段,接口可能返回一个JSON字符串或XML文档,然后客户端再去处理这个返回的信息。优点就是简单直接、开发方便;
- 如果一个系统内部子系统较多、接口非常多,RPC框架的优势就显示出来了:1 RPC用到了动态代理模式,能解耦服务;2 RPC调用是面向服务的封装,针对服务的可用性和效率等都做了优化(传输方式、传输协议、服务模型等),单纯使用HTTP调用则缺少了这些特性;3 RPC框架一般都有注册中心,有丰富的监控管理、发布和下线接口等;4 长连接:不必每次通信都要像HTTP一样去3次握手,减少了 络开销;
- Thrift是用于实现RPC通信的一种框架,支持跨语言,包括C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml, Delphi等;
- Thrift是一种典型的CS(客户端/服务端)结构,客户端和服务端可以使用不同的语言开发。既然客户端和服务端能使用不同的语言开发,就一定要有一种中间语言来关联客户端和服务端的语言,这种语言就是IDL(Interface Description Language);
- TSimpleServer的工作模式下只有一个工作线程,循环监听新请求的到来并完成对请求的处理,它只是在简单的演示时候使用;
- TSimpleServer的工作模式采用最简单的阻塞IO,实现方法简洁明了,便于理解,但是一次只能接收和处理一个socket连接,效率比较低,主要用于演示Thrift的工作过程,在实际开发过程中很少用到它。
- 一个AcceptThread线程对象,专门用于处理监听socket上的新连接;
- 若干个SelectorThread线程对象专门用于处理业务socket的 络I/O操作,所有 络数据的读写均是由这些线程来完成;
- 一个负载均衡器SelectorThreadLoadBalancer对象,主要用于AcceptThread线程接收到一个新socket连接请求时,决定将这个新连接请求分配给哪个SelectorThread线程;
- 一个ExecutorService类型的工作线程池,在SelectorThread线程中,监听到业务socket中有调用请求过来,则将请求读取之后,交给ExecutorService线程池中的线程完成此次调用的具体执行;
- 设置TServerSocket的listen()方法启动连接监听;
- 以阻塞的方式接受客户端的连接请求,每进入一个连接即为其创建一个TSocket对象(封装socket连接);
- 为客户端创建输入传输通道对象、输出传输通道对象、输入协议对象和输出协议对象;
- processor对象为服务模型创建之前创建的,用来处理具体的业务请求;
- 由于Python的GIL锁,所以Python没有真正的多线程,无法实现并行运作,多任务场景下效率低下,因此引入了两个多进程模型;
- 其中TForkingServer,服务端每次监听到client请求,会os.fork一个子进程进行业务处理;
- 维度是对数据进行分析时采取的一个角度。比如分析产品销售情况,可以按类别来分析,也可以按区域来分析,于是类别和区域就构成了两个维度;
- 每个维度可以有子维度;
- 维度表是对每个维至少使用一个表来存放维的层次、成员类别等维的描述信息;
- 维度表和事实表通过主键和外键联系在一起,形成星型,也称为“星型模式”;
- 对层次复杂的维,为避免冗余数据占用过大的存储空间,可以使用多个表描述,即“雪花型模式”;
- 维度表示例(产品维度表):Prod_ID,Product_Name,Category,Color,Size,Price
Thrift简介
Thrift整体架构
2 TNonblockingServer模式
THsHaServer的优点:
与TNonblockingServer模式相比,THsHaServer在完成数据读取之后,将业务处理过程交由一个线程池来完成,主线程直接返回进行下一次循环操作,效率大大提升。
THsHaServer的缺点:
主线程需要完成对所有socket的监听以及数据读写的工作,当并发请求数较多,且发送数据量较大时,监听socket上新连接请求不能被及时接收。
4 TThreadPoolServer模式
TThreadedSelectorServer模式中有一个专门的线程AcceptThread用于处理新连接请求,因此能够及时响应大量并发连接请求;另外它将 络I/O操作分散到多个SelectorThread线程中来完成,因此能够快速对 络I/O进行读写操作,能够很好地应对 络I/O较多的情况;TThreadedSelectorServer对于大部分应用场景性能都不会差,因此,如果实在不知道选择哪种工作模式,使用TThreadedSelectorServer就可以。
链接: Python服务端源码解析.
服务模型Server(Python)
1 TSimpleServer
TSimpleServer的工作模式采用最简单的阻塞IO,实现方法简洁明了,便于理解,但是一次只能接收和处理一个socket连接,效率比较低。
2 TThreadPoolServer
服务启动时先创建好self.threads个线程,每个线程负责从队列clients中获取客户端连接TSocket对象。而主线程负责accept客户端的连接并创建TSocket对象,放入clients队列。
3 TNonblockingServer
类似于Java版Thrift中的THsHaServer,思路是服务启动时创建threads个线程负责处理task队列中的任务消息。而主线程利用I/O多路复用技术将准备好的可读消息放入task队列供业务线程处理,同时在处理结束后可写时直接将结果返回给客户端。
4 TForkingServer VS TProcessPoolServer
1 维
维是关于一个组织想要记录的视角或观点。
参考: 维的百度百科.
2 维度
3 维度表
特性:
- 大量数据行,存储TB级;
- 主要是数值,少量文字或多媒体;
- 有和维度表连接的外键;
- 主要是静态数据和聚集数据;
5 星型模式结构示意图
3 数据源
- 数据仓库的数据很多时候是从OLTP应用的结构化数据库中提取的,用于支持内部的业务部门(销售、市场、运营等)进行业务分析;
4 用户
- 数据仓库主要是对业务系统对大量业务数据进行统计分析,所以会应用数据分析的部门是数据仓库的主要用户,例如:销售部、市场部、运营部、总裁办等;
- 数据湖中的数据都是原始数据,是未经整理的,更适合数据科学家,通过应用模型、技术发掘数据中的价值,去解决企业中的业务问题;
5 数据质量
- 数据仓库非常重视数据质量,数据都是经过处理的,像数据中台有很大一块是数据质量管理、数据资产管理等;
- 数据湖中数据可靠性较差,这些数据可能是任意状态、任意形态的数据;
6 数据模式
- 数据仓库在数据写入前就要定义好模式(schema),例如:先建立模型、建立表结构,然后导入数据,我们称之为write-schema;
- 数据湖中的数据没有没有模式,直到用户要访问数据、使用数据才会建立schema,我们称之为read-schema;
3 手工编写一个Servlet
- 继承HttpServlet;
- 重写doGet()或doPost()方法;
- 在web.xml中注册Servlet;
- 部署运行;
6 Servlet生命周期
7 Tomcat装载Servlet的三种情况
- Servlet容器启动时自动装载某些Servlet,实现它只需要在web.xml中的之间添加如下代码:,数字越小优先级越高;
- 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是服务器请求资源,服务器直接访问目标地址的UR
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!