用友iUAP马太航:Vert.x事件模型机制分析

createh52周前 (06-05)技术教程17

近年来,移动网络、社交网络和电商的兴起,使各大服务提供商的客户端请求数量激增,传统服务器架构已不堪重负,致使基于事件和异步的解决方案备受追捧,如Nginx、NodeJS。Vert.x框架基于事件和异步,依托于全异步Java服务器Netty,并扩展了很多其他特性,以其轻量、高性能、支持多语言开发而备受开发者青睐。

Vert.x是事件驱动的,其处理请求的高性能也是基于其事件机制。Vert.x的事件机制中有几个非常重要的概念:Event Loop、Event Loop Vertical、Worker Vertical、Event Bus、Vert.x Module。

Event Loops:即事件循环,是由Vert.x启动的事件处理线程,也是Vert.x项目对外开放的入口,Vert.x由此接收请求事件。一个Vert.x有一个或多个事件循环线程组成,线程最大数量为主机有效的CPU核数。

Event Loop Vertical:事件的业务处理线程,存在于Event Loop中,用于处理非阻塞短任务。

Worker Vertical : 事件的业务处理线程,用于处理长任务阻塞任务。

Event Bus:即事件总线,用于事件管理和数据传递,是Vert.x事件模型中最核心的部分,所有的事件都经由事件总线进行分发,包括Vertical之间的通信事件。

Vert.x Module : Vert.x项目模块,一个应用通常由多个模块组成,每个模块一般包含多个Vertical。

Vert.x以非阻塞IO的思想来实现高性能,非阻塞IO的实现,基于Event Loop Vertical和Worker Vertical的分离。在Vert.x中,Event Loop用于接收请求,并将短业务操作交由其内部的Vertical来处理,该模块是非阻塞的,这样可以保证请求的处理效率;阻塞任务通过Vert.x的事件机制脱离当前线程,生成一个任务事件交由Event Bus进行管理,Event Bus中注册了所有的监听事件,通过事件匹配选择合适的Worker Vertical,并将任务交由Worker Vertical进行处理,Worker Vertical处理完成后,将数据和事件信息进行封装,返回给Event Bus,Event Bus再次匹配事件定位到来源Vertical,然后将数据返回给Vertical,Vertical进一步将数据返回给客户端。将这一过程实现的核心是 Event Bus,Event Bus管理所有的事件,通过事件匹配和数据传递,将整个流程松耦合地衔接起来,让阻塞任务和非阻塞任务的分离成为可能。

下面以一个HTTP请求的处理过程详述Vert.x的事件处理流程。Vert.x启动时,会将Worker Vertical的事件监听信息加载到Event Bus中,包括监听事件类型和事件处理函数。当一个HTTP请求发送到Vert.x构建的应用时,Event Loop首先接收到请求,并对请求做分析、包装,然后将事件交给Event Bus来处理,Event Bus为此次请求事件添加一个事件ID,然后根据注册的Worker Vertical事件寻找已经注册的Worker Vertical监听函数,若未找到则会抛弃该事件,若找到则会对处理类进行实例化(此处使用线程池来管理),并同时使用事件ID在Event Bus中注册一个返回结果处理事件,该事件对应来源Event Loop Vertical。下一步由Worker Vertical实例执行事件处理函数,事件处理函数中通常包含业务处理、数据库操作等。Worker Vertical实例处理结束后,将返回结果和事件信息返回给Event Bus,Event Bus找到在其中注册的来源Event Loop Vertical实例,然后将返回数据交给该实例处理,Event Vertical实例进一步处理数据并将结果返回给浏览器。

事件驱动的处理过程,数据传递是非常重要的,Vert.x支持任意对象的数据格式。但使用对象时经常会遇到序列化和载入类的问题,比如在使用Java对象的时候,这种情况下使用JSON会更方便,这也是Vert.x推荐采用的方式。

Vert.x的事件模型,有如下几个特点:

1.非阻塞处理请求,异步执行阻塞程序,保证了请求处理的高效性。

2.使用Event Bus事件总线来进行通讯,可以轻松编写出分布式、松耦合、高扩展性的程序。

3.使用Event Bus事件总线是Vert.x真正实现多语言支持的基础,目前Vert.x已支持Java、JavaScript、Ruby、Python、Groovy、Clojure、Ceylon。

Vert.x发布于2011年,但发展迅速,除了多语言支持,目前也已经支持了Postgres、MySQL、MongoDB、Redis等常用组件,生态体系日趋成熟。基于事件和异步的服务架构优势明显,非常适用于最新的移动端后台、互联网、企业应用架构。??

相关文章

Nginx 超时事件的处理机制

本文基于Nginx 0.8.55源代码,并基于epoll机制分析对于nginx而言,事件机制的处理无非就是几个部分:网络IO事件的处理文件IO事件的处理定时器事件的处理(当然还有许多其他的不过我现在并...

Nginx之父被抓!员工“接私活儿”到底合不合法?

点击“技术领导力”关注 每天早上8:30推送作者| Mr.K 编辑| Emma来源| 技术领导力(ID:jishulingdaoli)01事件始末俄罗斯警方在当地时间12月12日,突击搜查了 Ngin...

7-Zip 遭抵制?呼吁者定下“三宗罪”:伪开源、不安全、作者来自俄罗斯

整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)谈及电脑必装软件有哪些时,压缩软件绝对算一个。由于各人需求不同,其选择的压缩软件也不尽相同,如 WinRAR、360 压缩、7-Zip、B...

吐量VS延迟——系统设计的生死博弈

系统设计的核心较量:延迟与吞吐量在计算机系统的江湖中,延迟(Latency)和吞吐量(Throughput)如同两位顶尖高手,既相互制衡,又共同决定系统的生死存亡。理解它们的本质与博弈关系,是每位架构...

Nginx这么香,还不知道怎么学?看完这份Nginx笔记你能立马上手

对于开发来说,我们在工作中多多少少都会遇到web服务的性能优化、高并发等问题,而 Nginx 是一个万能药。可以在百万并发连接下实现高吞吐量的 Web 服务,同时诸多应用场景下的问题都可以通过种种 N...

如何优化一个秒杀项目?

问题1:使用jmeter性能压测,定位瓶颈代码步骤流程:线程组--->Http请求--->查看结果树--->聚合报告tips:host的文件--->优先调用映射,减少DNS的时...