java - 我应该将 MongoDB 与实体的关系一起使用,以便在我的 Spring 5 项目中实现端到端的非阻塞吗?
问题描述
前段时间我开始了一个 Spring WebFlux 项目,这个项目的目标是提供一个 REST API,它从数据库中收集数据。
我目前采用响应式方法,这要感谢 Spring 5 版本中包含的 Reactor 项目并创建了响应式控制器。我需要将我的数据库规范化数据与关系持久化,这就是我使用 PostgreSQL 的原因。
在我写这行的时候,没有为 JDBC 和 JPA 提供响应式编程支持。但我的控制器只有在它们使用的其他组件也是非阻塞的情况下才是真正的非阻塞。如果我编写仍然依赖于阻塞存储库的 Spring WebFlux 控制器,那么我的响应式控制器将被阻塞,等待它们生成数据。
我想做到端到端的非阻塞,所以我想继续使用 Spring Data 支持的 NoSQL 数据库之一:Cassandra DB 或 MongoDB。我不认为 Cassandra DB 真的适合我的需求,我需要重写我的实体并以不同的方式思考我的数据库结构以面向查询。
我读到可以在我的实体与 MongoDB 之间保持一些关系,尤其是在没有折射器的最后一个 4.0 版本中,完全是我的数据库模式。但我想知道什么是值得的?
- 即使我需要保留关系数据,也要切换到 MongoDB
- 继续以阻塞方式获取数据,然后尽快将其转换为响应式类型
- 忘记 Spring WebFlux 并回到 Spring MVC(可能不会)
感谢您的任何帮助和建议!
解决方案
我认为这取决于您的上下文,似乎移动到文档数据库可能不适合您的数据,因为它似乎完全相关,除非您确定可以将数据建模为一堆聚合,否则您可能最终会在检查模型之间的一致性规则时遇到其他问题,例如事务一致性。作为第一个选项,我会尝试在另一个线程中获取数据,也许将调用包装在 rxjava observable 中。虽然它仍然是一个阻塞调用,但它不会阻塞主线程,您将能够更好地利用资源。
那是我的 2 美分。问候
推荐阅读
- javascript - 有没有办法按字母顺序排列 for...in 循环中的变量?
- javascript - classycountdown.js 上的固定日期
- javascript - 如何禁用 HTML/JS 中的样式元素?
- c# - InvalidOperationException:未指定 authenticationScheme,在 ASP.NET Core 2.0 中未找到 DefaultChallengeScheme
- msbuild - 在 MSBuild 中构建混合 .Net Standard 和 .NetFramework 解决方案
- asp.net - 域更改后 20 分钟的 SessionState
- c# - 在没有数组或任何循环的情况下从用户那里获取 5 个值并找到最大值和最小值
- azure - 天蓝色。手动触发时释放未触发并卡住
- python - TensorFlow Serving:在运行时更新 model_config(添加其他模型)
- python - 如何按值解析 argparser 参数