1
byte10 2022-06-08 11:53:20 +08:00
第一个问题:使用数据库操作必须是 非阻塞的, 有同步非阻塞和异步非阻塞,都可以。这些异步库 操作磁盘 IO 没听明白。这些数据库的异步库代码一般都是网络 IO ,应该不涉及到写磁盘 IO 。
第二个问题:本质是 NIO ,用 NIO 客户端。 第三个:但是 mysql 的通信协议 可能不支持多路复用(我没确认过),这里的多路复用是指协议上的多路复用(非 NIO 那种概念)。这个多路复用,就是在一个 TCP 连接中可以存在多条流。http2 支持多路复用,http 不支持。也就是说即便用上 NIO 也未必能带来更大的吞吐量,需要同时调整 http 连接数。同理 mysql 也可能会在连接数出现瓶颈。请求的数据可能会堆积在服务端。 第四个,由于是响应式编程,注意下背压的问题,保护好下游的服务。 |
2
czd670 OP @byte10 这几天重新学了 nio 和 netty ,敲了代码。第二点基本懂了。关于第一点 webflux 操作 mysql 的问题,你指的是不是:与 mysql 的网络 io 操作,也是利用 nio 来实现?
流程大概是:提交 io 事件、nio 写事件、nio 读事件,设置 handler 来处理 mysql 的返回数据?但是这个异步能力,需要提供 mysql 异步组件,例如现在的 r2dbc |
3
czd670 OP @byte10 还有个疑问,第一个问题,说使用数据库必须用非阻塞。我的理解是,在 webflux 里面,非阻塞只应用在接受请求发出请求。数据库操作,我还是在工作线程里面使用阻塞 io 也是可以的吧?
|
4
byte10 2022-06-09 16:36:04 +08:00
@czd670 是的,需要用 r2dbc 。 “我的理解是,在 webflux 里面,非阻塞只应用在接受请求发出请求。数据库操作,我还是在工作线程里面使用阻塞 io 也是可以的吧?” ,不是很理解你表达啥。工作线程 使用阻塞 IO 是不行的。性能会严重 下降
|
5
czd670 OP @byte10 我知道性能会下降,我的意思是,代码上这样做是可以的,只是会影响性能。我了解到的是,传统 jdbc 因为是基于线程来开发的,也就是事物等机制需要绑定线程,所以做不到异步 io ,但不代表不能用?
|
8
ychost 2022-06-10 11:30:04 +08:00
主要看驱动,MySQL 也有支持异步的 R2BC 等等,其余的网络,文件等操作都是直接支持的,底层应该是系统的 epoll 和 SELECT
|