首页 > 解决方案 > 如果 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 重试写入选项,但只尝试一次

标签: javamongodbspring-boot

解决方案


在我的脑海中,以下两个选项浮现在脑海中。

  • 有一个备份数据存储,如果 MongoDB 关闭(例如 Mongo 的另一个实例、自由格式的文本文件、PostgreSQL),您可以写入该存储,并自动切换到它。之后您可能必须手动将该数据放回 Mongo,然后重新打开 Mongo 写入,但如果 Mongo 出现故障的情况很少见,这可能是可以接受的。
  • 在您的主应用程序和唯一目的是写入 Mongo 的工作进程之间放置一个队列。如果 Mongo 宕机,工作进程将停止,失败的写入将留在队列中。当 Mongo 重新启动时,工作进程会重新启动,一切都会好起来的。

推荐阅读