当前位置: 首页 > 工具软件 > mysql-async > 使用案例 >

vertx异步驱动vertx-mysql-postgresql-client

蔺宇
2023-12-01
文章主要介绍vertx中的mysql异步client。

1:解释mysql异步驱动,这儿举一个场景,当客户端发起一个请求到后端来,后端通过处理需要操作db。之前的阻塞式驱动,需要后端处理请求的线程阻塞在这儿,等待,与db的io操作返回相应的数据,当使用异步驱动后,处理业务请求的线程,只需要把要做的事情交给异步驱动,他就不管了,去做其他事情,不阻塞这个业务线程。

2:解释下,阻塞与不阻塞之间的区别,

2.1:在java的线程模型里面,用户态线程与内核态线程是1:1的关系,当用户态线程阻塞,内核态线程也会阻塞,cpu在调度线程的时候,一个cpu核心同时只能做一件事情,当线程阻塞越多,会造成cpu的有效计算效率下降很多,也会造成大量的线程上下文切换,但是在java这样的线程模型下,,有线程阻塞了,你又不得不,起新的线程来继续做事情。

2.2:无阻塞,通过一些解决方案,达到,内核态线程无阻塞,真正做事情,cpu其实只要有相对应的线程数,性能就会非常高。在vertx中实现无阻塞的方式,是通过代码层面来控制的,他把需要阻塞的代码,当成一个事件提交到自己的一个事件池,线程只会不断的取事件来执行。

3:vertx提供的mysql异步驱动,底层依赖postgresql-async_2.12,我看过这个框架的源码,他底层是用netty去实现跟db做io交互,这样,他自身需要少量的线程就可以支撑多个连接,大致的执行方式是,vertx的业务线程执行需要操作db的时候,把要做的事情,交给postgresql-async_2.12,业务线程就回去继续执行其他事件,当postgresql-async_2.12这边netty拿到db响应的结果后,就会去激活,业务线程当时为这个事件注册的handler,那么这个handler又可以被线程继续执行。这样来实现,在操作db的时候,也没有任何线程会阻塞。

4:vertx这边几乎提供了异步rpc,异步访问其他第三方需要发起http请求,异步操作redis,或者kafka,等等。目前也有相对完整的生态。本人也实现,用vertx+hazelcast在k8s上做服务网格。

 类似资料: