角马科技
JiaoMa Tech 一家专注技术的好公司
【技术讲堂】
VERT.X是什么鬼?从入门到差点放弃
VERT.X 一个基于JVM、轻量级、高性能的应用平台。
首先先来看一下TechEmpower的基准测试。
-
TechEmpower框架基准项目 :执行基本任务(如JSON序列化,数据库访问和服务器端模板组合)的许多Web应用程序框架的性能比较
-
云上测试环境:4核/14GB/临时存储:200GB(SSD)/千兆
单条SQL查询,排名No1
复合SQL查询,排名No3
全表查询,排名No1
数据更新,排名No3
Vert.x在性能基准测试表现不错。
Postgres和Vert.x在应用中配合使用会使性能受益。
Netty是很给力的。
什么是Vert.x?
-
Vert.x是一个基于JVM、轻量级、高性能的应用平台。
-
JVM上的Reative开发套件
-
基于全异步Java服务器Netty。
-
同时支持多种编程语言。
-
异步无锁编程。
-
极好的分布式开发支持。
-
https://vertx.io/
Vert.x的多语种特性
-
您可以将Vert.x与多种语言一起使用,包括Java,JavaScript,Groovy,Ruby,Ceylon,Scala和Kotlin。
-
Vert.x不鼓吹什么语言是最好的 - 根据手头的任务和您的团队的技能配置选择您的语言。
-
我们为Vert.x支持的每种语言提供惯用 API。
推荐书籍:Building Reactive Micoservices in Java
Vert.x为Java中构建反应式微服务平台提供了整套工具包。
包含Web、Data access、Reactive、Microservices、MQTT、Authentication and Authorisation、Integration、Event Bus Bridge、Devops、Testing、Clustering、Services等等。
一般用途
-
Vert.x非常灵活 - 无论是简单的网络实用程序,复杂的现代Web应用程序,HTTP / REST微服务,大容量事件处理还是全面的后端消息总线应用程序,Vert.x都非常适合。
-
Vert.x被许多不同的公司用于从实时游戏到银行业务以及介于两者之间的所有事物。
-
Vert.x不是限制性框架或容器,我们也没有告诉您编写应用程序的正确方法。
优势
-
Vert.x是轻量级的 - Vert.x核心大小约为650kB。
-
Vert.x 很快。
-
Vert.x 不是应用程序服务器。
-
Vert.x是模块化的。
-
Vert.x是创建轻量级,高性能微服务的理想选择。
什么是Verticle?
-
Verticle 是由 Vert.x 部署和运行的代码块。
-
默认情况一个 Vert.x 实例维护了N(默认情况下N = CPU核数 x 2)个 Event Loop 线程。
-
Verticle 实例可使用任意 Vert.x 支持的编程语言编写,而且一个简单的应用程序也可以包含多种语言编写的 Verticle。
-
可以将 Verticle 想成 Actor Model 中的 Actor。
-
一个应用程序通常是由在同一个 Vert.x 实例中同时运行的许多 Verticle 实例组合而成。
Verticle 的类型
-
Stardand Verticle 是最常用的一类 Verticle —— 它们永远运行在 Event Loop 线程上。
-
Worker Verticle 会运行在 Worker Pool 中的线程上。一个实例绝对不会被多个线程同时执行。
-
Multi-Threaded Worker Verticle也会运行在 Worker Pool 中的线程上。一个实例可以由多个线程同时执行(注:因此需要开发者自己确保线程安全)。
Standard Verticle
-
当 Standard Verticle 被创建时,它会被分派给一个 Event Loop 线程,并在这个 Event Loop 中执行它的start方法。当您在一个 Event Loop 上调用了 Core API 中的方法并传入了处理器时,Vert.x 将保证用与调用该方法时相同的 Event Loop 来执行这些处理器。
-
Verticle 实例中所有的代码都是在相同Event Loop中执行(只要您不创建自己的线程并调用它!)
-
意味着您可以将您的应用中的所有代码用单线程方式编写,让 Vert.x 去考虑线程和扩展问题。您不用再考虑 synchronized 和 volatile 的问题,也可以避免传统的多线程应用经常会遇到的竞态条件和死锁的问题。
Worker Verticle
-
Worker Verticle 和 Standard Verticle 很像,但它并不是由一个 Event Loop 来执行,而是由Vert.x中的 Worker Pool 中的线程执行。
-
Worker Verticle 被设计来调用阻塞式代码,它不会阻塞任何 Event Loop。
-
如果您不想使用 Worker Verticle 来运行阻塞式代码,您还可以在一个Event Loop中直接使用 内联阻塞式代码。
-
若您想要将 Verticle 部署成一个 Worker Verticle,您可以通过 setWorker 方法来设置。
-
Worker Verticle 实例绝对不会在 Vert.x 中被多个线程同时执行,但它可以在不同时间由不同线程执行。
Multi-threaded Worker Verticle
-
一个 Multi-threaded Worker Verticle 近似于普通的 Worker Verticle,但是它可以由不同的线程同时执行。
-
Multi-threaded Worker Verticle 是一个高级功能,大部分应用程序不会需要它。由于这些 Verticle 是并发的,您必须小心地使用标准的Java多线程技术来保持 Verticle 的状态一致性。
部署Verticle举例
vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle");
vertx.deployVerticle("verticles/myverticle.js");
vertx.deployVerticle("verticles/my_verticle.rb");
Event Bus
Event Bus 负责 Verticle 之间的通信。
Actor并发模型
-
在Actor并发模型中,它的主角是Actor,实际上它类似于一种Worker线程,它们之间通过消息相互通信(在Vert.x中,它们之间的消息介质就是Event Bus),这些消息的发送是异步的,可并行。
-
所有Actor的状态由Actor自身维护,且外部不可访问它,除非它自己暴露了访问自身状态的接口;
-
Actor和Actor之间的通信使用的是消息;
-
一个Actor可发送消息给另外一个Actor,也可以响应另外一个Actor发过来的消息,同时它可以改变自身的内部状态;
-
Actor可能阻塞自己(就是内部调用阻塞IO的代码,但Actor不应该阻塞它运行的线程)。
-
Actor模型的代表:Akka/Erlang、以及Vert.x都是使用的Actor模型。
CSP模型
-
CSP模型,也就是Channel模型,在这种模型中,在Worker和Worker之间引入了一种新的机制,称为Channel,这种模型的Worker线程相互之间是通过Channel进行消息发布、以及监听,而且Worker之间相互透明:它既不知道消息发送给谁,也不知道自己消费的消息是哪一个Worker发出的。
-
Go语言就是使用的这种CSP模型,它利用协程Goroutine和通道Channel实现。
-
Go协程Goroutine,它是一种轻量级线程(并非操作系统的线程,而是将一个操作系统线程分段使用,通过调度器实现协作式调度。)它是一种绿色线程,又可称为微线程,它和Corouting协程的区别在于:当它发现阻塞后会启动新的微线程。
-
通道Channel:类似Unix的Pipe,用于协程之间通讯和同步,虽然协程自身之间已经解耦,但Worker和Channel之间依然存在耦合。
进程、线程、协程
-
进程是为了提高CPU的利用率,减少CPU资源调度过程中的上下文切换,它是操作系统中的最小单位。
-
线程则是为了提高进程内的资源利用率,突破进程本身的缺陷,在进程内部实现并发,它是进程内的最小单位。
-
协程(又称微线程)往下再走一级,提高线程内的资源利用率,减少上下文切换的开销,突破线程本身的缺陷,它是线程内的最小单位。
Reactor 模式介绍
-
Reactor模式又称为Reactor设计模式,这个模式是从NIO中出来的“反应器模式”,这种设计模式是为高并发处理量身打造的设计模式。
-
Reactor模式是一种基于事件驱动模型的设计模式。
-
过多路复用的思想大大减少线程资源的使用。
-
主线程(IO处理单元)只负责监听socket文件描述符上是否有事件发生,有的话就立即将该事件通知工作线程(逻辑处理单元)。除此之外,主线程不做任何其他实质性的工作,读写数据、接受新的连接请求、处理客户端请求均在工作线程中完成。
01
Reactor 模式(1)
02
Reactor 模式(2)
03
Reactor 模式(3)
04
Reactor 模式(4)
Reactor 模式优势
-
大多数设计模式的共性:解耦、提升复用性、模块化、可移植性、事件驱动、细力度的并发控制等。
-
更为显著的是对性能的提升,即不需要每个 Client 对应一个线程,减少线程的使用。
Reactive Programming
-
反应式编程是一种基于 数据流 (data stream) 和 变化传递 (propagation of change) 的 声明式 (declarative) 的编程范式。
-
Reactive Streams 是由 Netflix、TypeSafe、Pivotal 等公司发起的规范。
Java中的反应堆
-
Netflix(开发了 RxJava,Hystrix是以 RxJava 为基础开发的)
-
TypeSafe(开发了 Scala、Akka)
-
Pivatol(开发了 Spring、Reactor)
常见的反应式编程框架
-
Reactor 是基于 Reactive Streams 一套 反应式编程框架。
-
WebFlux 以 Reactor 为基础,实现 Web 领域的 反应式编程框架。
-
SpringBoot2.0是基于WebFlux的 反应式编程框架。
-
美团客户端响应式框架EasyReact。
-
ReactiveX系列,RxJava,RxJs,rx.Net, RxScala等
-
Cycle.js 和 Bacon.js是一个 反应式JavaScript 框架
◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆
哇,你真厉害,竟然能坚持到最后~
好学的程序猿运气都不差!