我想知道如果我不检查错误代码是否会检测到任何持久性故障?如果是这样,在检测到错误的同时快速(异步)写入的正确方法是什么?
答案 0 :(得分:2)
如果您没有检查错误,那么您的更新只是fireAndForget。你确实会错过所有可能出现的错误。有关MongoDB中可用的写入模式,请参阅MongoDB WriteConcerns(抱歉,我总是找不到官方的,非驱动程序相关的文档,我真的应该为它添加书签)。
因此,使用NORMAL,您将至少获得连接错误,NONE完全没有例外。如果您想了解异常情况,您必须使用其他模式之一,这些模式的不同仅在于它们为您提供的持久性保证。
在运行异步时,您无法检测错误,因为这违背了意图。发送写操作的连接可能已经关闭或重用,因此您无法通过该连接发送它。更进一步,只有您的实际代码知道如果失败该怎么办。由于mongoDB不提供某些远程过程调用异步通知您更新,因此您必须等到写入完成到给定阶段。
所以最快,但最不可靠的是SAFE,其中写入仅发生在内存中。 JOURNAL为您提供了至少写入磁盘的安全性。使用FSYNC,您将在磁盘上的数据库中保留这些更改。 REPLICA至少有两个副本写了它,而且超过一半的副本已写入它的MAJORITY(三个副本应该是默认值,这没有区别)。
我认为有异步的唯一机会就是让一个单独的线程执行所有写操作同步。此线程可以处理实际更新以及在无法执行处理此故障所需的操作时调用的类。但我不认为这是一个很好的应用程序设计。
答案 1 :(得分:1)
是的,根据错误,如果您不检查返回的错误代码,它可能会无提示失败。有必要等待错误检查。你唯一的另一个选择就是让你的应用偶尔告诉用户“哎呀,还记得刚才我的行为就像我保存了你的数据吗?好吧,不是真的。”