Vert.x 是一个基于 JVM、轻量级、高性能的应用平台。今年 10 月,Vert.x 开源项目的核心贡献者 Paulo Lopes 将来到 QCon 全球软件开发大会(上海站)2019,他透露,Vert.x 4 将于 2019 年底发布。为让大家对 Vert.x 有一个更加清晰的了解,我们对他进行了采访。
如果时间回到六年前,你会看到一场 VMware 和 Red Hat 的 battle 。
一位名叫 Tim Fox 的开发人员曾在 VMware 的 SpringSource 部门工作。在此期间,他领导开发了 Vert.x 项目。2012 年,Tim 跳槽到了 Red Hat 并希望能够继续从事该项目的开发,却得到了一封律师函。VMware 让他交出 Vert.x 商标、域名、博客、GitHub 帐户及 Google Group 的控制权。此后 VMWare 与 RedHat 多次商讨以寻找出一个双方都满意的解决方案,但都无疾而终。僵持许久之后,VMware 最终同意将项目和相关 IP 转移到Eclipse 基金会。2016 年 1 月 12 日,Tim Fox 辞去了 Vert.x 项目负责人一职,目前该职务由长期贡献者 Julien Viet 担任。
Eclipse Vert.x 是一个用于在 JVM 上构建响应式应用程序的工具包。根据官方描述,Eclipse Vert.x 是事件驱动和非阻塞的。这意味着您的应用程序可以使用少量内核线程处理大量并发。Vert.x 可让您的应用程序以最少的硬件进行扩展。它有一个模块化、高性能、易于使用的响应式生态系统。正因为生态系统的多样性,我们可以编写像实时 Web 应用、IoT、协议适配器和分布式应用等不同种类的程序,当然也可以构建微服务。
它的高性能、低延迟特性吸引了不少开发者,目前,该项目在 GitHub 上已经获得了超过 10k 的 star。
项目地址: https://github.com/eclipse-vertx/vert.x/
去年 10 月,Vert.x 项目负责人、Red Hat 首席软件工程师 Julien Viet 在 QCon 全球软件开发大会(上海站)2018 从 HTTP 性能基准测试出发与我们探讨了Vert.x 高性能的秘密。今年 10 月,Vert.x 开源项目的核心贡献者Paulo Lopes也将来到 QCon,他透露,Vert.x 4 将于 2019 年底发布。为让大家对 Vert.x 有一个更加清晰的了解,我们采访了 Paulo 。
Paulo:Vert.x 是一个运行在 JVM 中的事件驱动的、异步非阻塞、支持多种编程语言的应用开发工具。你可以把它当做一组积木,允许你开发在所需的工作负载下保持低延迟特性的高性能应用。Vert.x 能让开发人员自由决定应用程序应该如何工作。由于每个应用程序都是独一无二的,我们并不提倡开发人员应该如何构建他们的应用程序;我们称之为“不固执己见”。我们观察到,Vert.x 的用户主要将它用于嵌入较大的应用程序,这使得它非常通用,比如你可以在 Spring 应用程序中使用 Vert.x。
Paulo:编写非阻塞、并发和可伸缩的代码是困难的。通过提供基于 reactor 模式的简单编程模型,Vert.x 提供了构建此类应用程序的最简单方法,这将允许应用程序高效地使用所有硬件资源。使用内置的集群和事件驱动体系结构,可以让开发人员专注于领域问题,而不是技术细节,扩展变得轻而易举。
Paulo:Verticle 是由 Vert.x 部署和运行的代码块。一个 Vert.x 实例维护几个事件循环线程(通常是可用 CPU 内核数的 2 倍)。Verticle 可以用 Vert.x 支持的任何语言编写,单个应用程序可以包括用多种语言编写的 verticle。你可以把 Verticle 当做 Actor 模型中的 Actor。
Vert.x 的 API 是事件驱动的。在大多数案例中,Vert.x 使用一个叫做 event loop 的线程来调用你的处理程序。由于在 Vert.x 或应用程序块中没有任何内容,event loop 可以在事件到达时连续地将事件传递给不同的处理程序。
EventBus 是 Vert.x 的神经系统。它允许应用程序的不同部分相互通信,而不管它们是用什么语言编写的,也不管它们是在同一个 Vert.x 实例中,还是在不同的 Vert.x 实例中(以集群形式)。它甚至可以桥接以允许运行在浏览器中的客户端 JavaScript 在同一 EventBus 上通信。
Paulo:如上所说,Vert.x 的 API 主要是事件驱动的,可以将事件看作计时器、HTTP 请求、文件读取等等)。如果可以立即提供结果,则会立即返回。如果没有这个功能,您通常会在稍后提供一个 handler 来接收事件。
因为没有一个 Vert.x API 会阻塞线程,这意味着您可以使用 Vert.x 来处理大量的并发,只需使用少量的线程。
使用传统的阻塞 API,调用线程可能会在读取文件、接收 HTTP 请求或向数据库发送数据时阻塞。在上述所有情况下,当你的线程等待结果时,它不能做任何其他事情,在这段时间它就是无用的,这样一来效率就太低了。
Paulo:每个人都可以在任何地方使用 Vert.x。您可以构建一个小型 web 应用程序、一个复杂的分布式电子商务解决方案或构建集成,例如,将 ActiveMQ 桥接到 Kafka,而无需 HTTP 桥接。用户最初对 Vert.x 的关注就在于它的优秀性能。想象一下,假如你是电子商务行业的,时间就是金钱,我们的每一秒都十分珍贵,Vert.X 将帮助企业更快地向客户提供产品,更快地完成交易。这不需要额外的硬件成本,多么合算!
Paulo:是的,Vert.x 速度非常快。然而,要给出具体的数字总是很困难的,因为这些数字应该根据具体情况进行评估。不过我可以给你举个最简单的例子,比如我们建立了一个应用,它要在 REST API 端点上返回 "Hello World",TechEmpower(一个独立的基准测试)表明,在相同的条件下,Vert.x 应用可以提供超过 450 万个请求 / 秒的模式,而优化后的 Servlet 在 Tomcat 上却只能提供大约 90 万个请求 / 秒的服务。
这种糟糕的性能差异确实可能存在。因为 Vert.x 有效地使用了所有可用的计算资源。使用 reactor 模式,应用程序不受处理请求的线程数(就像在典型的 Servlet 容器上发生的那样)的限制。Event loop 使用所有请求的全部 CPU 容量(因为没有阻塞 I/O),而不是等待 I/O 处理完毕单个请求的线程。这个小小的差别就是造成这种结果的原因。
Paulo:简而言之,微服务是分布在网络上的大量小型应用程序节点。这些节点通过网络进行通信,这意味着任何两个节点都有应用程序外部的 I/O 性能开销。延迟是微服务中的一个关键问题,因为服务之间的每一跳都会增加请求 / 响应时间。选择 Vert.x 将允许微服务高效地使用 CPU 和网络,从而减少整个应用程序的延迟。
Paulo:Vert.x 4.0 会在今年年底与大家见面。事实上,我们已经发布了一些里程碑式的更新,而且我们还将继续。Vert.x 4.0 专注于提供社区期望的两个重要功能:它提供了一个面向未来的编程模型,它还集成了 Java 内置的 CompletionStage,当然,这不会妨碍我们现在流行的与 RxJava 的集成。我们还将通过与 Zipkin 或 OpenTracing 等工具集成来支持分布式跟踪。
其实,Vert.x 4 是 Vert.x 3.x 系列的演进版本, 它带来了上面提到的两个特性。因为任何新的主要版本都会破坏一些 API,对此我们有明确的政策,下面我会解释一下。
首先,它不是破坏性改变的露天酒会,任何重大变化都必须有一个很好的理由。然后,任何破坏性改变在 Vert.x 3.x 系列中都会有相应解决办法的替代方案。
例如,在 Vert.x 4 版本里,我们把 Vert.x Web 中的 HTTP cookie API 移到了 Vert.x Core 里面,为了实现这一点,我们为 Vert.x 3.8 的 Vert.x Core 提供了新的 cookie API ,并弃用了 Vert.x Web cookie API,因此应用程序可以为升级到 Vert.x 4 做准备了。
总的来说,Vert.x 3.x 现在正在加速迁移到 Vert.x 4。
最后但同样重要的是,目前在 MEAP 中的 Vert.x 行动手册自然涵盖了 Vert.x 3。我们的基准是,本书中的所有示例也将适用于 Vert.x 4。书中所有的例子都是 Java 代码,我们用 Vert.x 3.x 和 Vert.x 4 的里程碑编译来检查这个代码。
Paulo:Vert.x 已经成熟,并被证明是构建高性能和可伸缩应用程序的可靠框架。对于新用户来说,学习成本可能很高,因为它需要一种不同于我们过去几年在 Java 世界中看到的思维方式。反应式编程在过去是一个复杂的主题,但今天,它已经被诸如 Reactive Extension 之类的库广泛使用。随着越来越多的开发人员开始了解这个编程模型,将它应用到后端服务器代码并采用 Vert.x 就越容易了。正如我们所讨论的,它的优点是巨大的,所以我建议所有的读者尝试一下。
目前,VMware、Red Hat、Hulu、增信通、易快报、力谱宿云、炼石网络等公司都在使用它,具体可见官网。
Paulo:Vert.x 是 Eclipse Foundation 的一个项目,因此,它是独立的。这个项目由很多来自不同公司的贡献者开发,有些是 Eclipse Foundation 的成员。
Red Hat 赞助了 Vert.x 项目,雇佣了一些贡献者,让他们能做喜欢的事情并以此谋生。当然,作为 RHOAR 产品的一部分,Red Hat 为 Vert.x 提供支持。Red Hat 对 Vert.x 十分感兴趣,因为它构建了许多行之有效的解决方案,比如 Strimzi 项目(一个致力于将 Apache Kafka 运行在 Kubernetes 上的项目),另外,Quarkus 项目(一个为 GraalVM 和 OpenJDK HotSpot 量身定制的 Kubernetes 原生 Java 框架)最近也在使用 Vert.x 构建 HTTP 客户端和服务器。
采访嘉宾:Paulo Lopes 是 Vert.x 开源项目的核心贡献者,目前就职于 Red Hat,任首席软件工程师。他拥有超过 10 年的软件开发经验,在编写、重写、写到想撞墙等方面的经验十分丰富。为让 Vert.x 成为一个更棒的框架,他一直在编写和重新编写高性能 Web 应用程序的道路上奋斗着。
在 QCon 上海 2019 的演讲中,Paulo 将介绍 Vert.x 在 ES4X(基于 GraalVM 和 Vert.x 的开发的 JavaScript Runtime)中的应用,它为 JavaScript 应用程序带来了令人难以置信的性能提升。想要破解延迟难题,点此了解。