与传统的“每个连接一个线程”模型相比,带有R2DBC的Micronaut Data是一种更具可扩展性的方法吗?

问题描述

根据micronaut-data reactive guide

” ... 如果是响应式执行,并且如果支持实现受阻,则Micronaut Data将使用Configured I / O线程池来安排在其他线程上执行查询。

如果后备实现本身在驱动程序级别支持响应类型,则不使用I / O线程池,而是假定驱动程序将以非阻塞方式处理查询...”

我的直截了当的问题:访问关系数据库(例如PostGres R2DBC driver)时抛出R2DBC,Micronaut Data会依靠R2DBC驱动程序以非阻塞方式进行处理并且具有更大的可伸缩性吗?

假设我的微服务公开了一个基于ReactiveX的Reactive端点,并且必须访问阻塞数据源抛出Micronaut Data JDBC(例如,生产版本中还没有Oracle R2DBC),从上面可以很清楚地看到,访问数据时将使用“配置I / O线程池”。我是否会完全失去反应性端点的好处?

这是我与Micronaut合作的第一个项目,而我采用Reactive方法的项目很少。我到目前为止还不是反应式最佳实践的专家,但是我已经阅读了多个博客:如果您有阻塞源,请避免使用反应式堆栈。我还记得读过文章,将非阻塞与阻塞设计混合会产生更糟糕的结果,这主要是因为Eventloop(例如Netty)的设计方式。由于我将Micronaut与ReactiveX和Relational Database结合使用,在某些情况下将R2DBC与JDBC一起使用,因此,对于我的疑问,我将不胜感激。

解决方法

您不会完全失去好处,因为如果您的HTTP请求没有阻塞,则可以使用JDBC逻辑来组合这些操作。

但是,如果您想使用R2DBC实现真正的非阻塞,请参见https://github.com/micronaut-projects/micronaut-r2dbc/

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...