java - 我应该在 Spring 5 项目中使用具有实体关系的 MongoDB 来实现端到端非阻塞吗?

标签 java spring spring-data reactive-programming spring-webflux

我不久前启动了一个 Spring WebFlux 项目,该项目的目标是提供一个从数据库收集数据的 REST API。

我目前采用响应式(Reactive)方法,感谢 Spring 5 版本中包含的 Reactor 项目并创建了响应式(Reactive) Controller 。我需要持久保存带有关系的数据库规范化数据,这就是我使用 PostgreSQL 的原因。

在我写这行代码时,没有为 JDBC 和 JPA 提供响应式(Reactive)编程支持。但是,只有当我的 Controller 使用的其他组件也是非阻塞的时,我的 Controller 才真正是非阻塞的。如果我编写仍然依赖于阻塞存储库的 Spring WebFlux Controller ,那么我的响应式(Reactive) Controller 将被阻塞,等待它们生成数据。

我希望实现端到端非阻塞,所以我想继续使用 Spring Data 支持的 NoSQL 数据库之一:Cassandra DB 或 MongoDB。我认为 Cassandra DB 并不真正适合我的需求,我需要重写我的实体并以不同的方式思考我的数据库结构以面向查询。

我读到可以在我的实体与 MongoDB 之间保留一些关系,特别是在没有完全折射我的数据库模式的最新 4.0 版本中。但我想知道什么值得?

  • 即使我需要保留关系数据,也要切换到 MongoDB
  • 继续以阻塞方式获取数据,然后尽快将其转换为响应式
  • 忘记 Spring WebFlux 并返回 Spring MVC(可能不会)

感谢您的帮助和建议!

最佳答案

我认为这取决于您的上下文,似乎移动到文档数据库可能不太适合您的数据,因为它看起来完全相关,除非您确定可以将数据建模为一堆聚合,否则您在检查模型之间的一致性规则时,可能最终会出现其他问题,例如事务一致性。作为第一个选择,我会尝试在另一个线程中获取数据,也许将调用包装在 rxjava observable 中。虽然它仍然是一个阻塞调用,但它不会阻塞主线程,您将能够更好地利用资源。

这是我的 2 美分。 问候

关于java - 我应该在 Spring 5 项目中使用具有实体关系的 MongoDB 来实现端到端非阻塞吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51859342/

相关文章:

java - 使用 += 构建从 null 开始的字符串的紧凑方法

java - Android 上的 webGL 替代品

java - Spring 框架。根据请求参数在运行时注入(inject) bean

spring - 如何保证Spring @Autowired注入(inject)在构造函数中可以访问

java - Spring Data Elastic Search - 按距离对地理位置进行排序

java - Selenium sendkeys 使用 Chrome 驱动程序删除字符

java - 如何使用JAVA显式实现接口(interface)成员?

java - Java 中的服务层或仅存储库

java - 如何用JPA管理多个实体?

java - 如何从 Spring Data 存储库调用 MySQL 函数