java - 如果 MongoDB 关闭并且操作处于挂起状态,应该采取什么策略
问题描述
我有一个列表,其中每个员工都分配了一个经理。因此,对于每个对象,其中都有一个 Manager 引用,它不是一个 manager id,而是一组字段,我们可以通过这些字段来识别一个 manager。
每个 Manager 对象都有Employees的引用列表
所以类看起来像这样
Class Manager {
ObjectId _id;
//some attributes
List<Employees> employees;
LocalDateTime createdOn;
}
Class Employee {
ObjectId _id
//some attributes
Manager manager; //Having only attributes but not ObjectId of manager
LocalDateTime createdOn;
}
我们这样做是因为可以更改此经理的名称和某些属性,因此可以在经理集合中引入一个新的经理对象,然后所有现有员工现在都属于新的经理对象。我们的结构就是这样。
查询时,我们会得到一个Manager的属性,我们根据属性和createdOn字段返回最新的经理的员工列表
所以我面临的问题是:
在保存属于新经理的新员工列表时,我首先使用 mongoClient 的 insertMany() 函数保存所有员工。然后我使用 insert() 保存 Manager。
如果在保存 Employee 列表之后,在保存 Manager 之前,Mongo 发生了一些不好的事情并且 Db 已关闭,所以我将无法保存 Manager,因此所有员工现在都将成为孤儿。
我可以遵循哪些策略来确保当 MongoDB 再次出现时,我可以先存储所有待处理的对象,然后继续进行其余操作。
我正在使用带有 Raw Mongo Java 驱动程序 3.8.0 和 Java 8 的 SpringBoot 2
我尝试过 Mongo 重试写入选项,但只尝试一次
解决方案
在我的脑海中,以下两个选项浮现在脑海中。
- 有一个备份数据存储,如果 MongoDB 关闭(例如 Mongo 的另一个实例、自由格式的文本文件、PostgreSQL),您可以写入该存储,并自动切换到它。之后您可能必须手动将该数据放回 Mongo,然后重新打开 Mongo 写入,但如果 Mongo 出现故障的情况很少见,这可能是可以接受的。
- 在您的主应用程序和唯一目的是写入 Mongo 的工作进程之间放置一个队列。如果 Mongo 宕机,工作进程将停止,失败的写入将留在队列中。当 Mongo 重新启动时,工作进程会重新启动,一切都会好起来的。
推荐阅读
- laravel - 在 vuex 操作中调用时未定义路由器
- java - 如何在android中使用bitcoinj(walletappkit)从助记符创建比特币钱包
- tempus-dominus-datetimepicker - 如何在 Tempus Dominus Bootstrap-4 日期时间选择器中仅突出显示和启用特定的工作日?
- django - 如何从 ManyToOneRel 对象中获取相关的模型类名称?
- vb.net - VB.NET Try/Catch 块问题 - 为什么不抛出异常
- php - 在 if 语句中插入查询
- r - R中出现值的提取频率
- latex - 我的页脚在 R-Markdown 的第一页(但不是页眉!)之后消失了
- angular - 在 Ionic 4 PWA 应用而不是主页上设置 start_url
- oracle - 无法连接到 Oracle 服务