3

エラーコードをチェックしないと、永続性の失敗が検出されなくなるのではないかと思いますか?もしそうなら、エラーを検出しながら高速に(非同期に)書き込む正しい方法は何ですか?

4

2 に答える 2

2

エラーをチェックしない場合、更新はfireAndForgetのみです。発生する可能性のあるすべてのエラーを実際に見逃します。MongoDBで使用可能な書き込みモードについては、MongoDB WriteConcernsを参照してください(ドライバーに関連しない公式のドキュメントが常に見つからないので、ブックマークする必要があります)。
したがって、NORMALを使用すると、少なくとも接続エラーが発生しますが、例外はまったくありません。例外の通知を受け取りたい場合は、他のモードの1つを使用する必要があります。これらのモードは、提供される永続性の保証のみが異なります。
非同期で実行している場合、これは意図に反しているため、エラーを検出することはできません。書き込み操作を送信した接続は、すでに閉じられているか再利用されている可能性があるため、その接続を介して送信することはできません。さらに、失敗した場合の対処方法を知っているのは実際のコードだけです。mongoDBは、非同期へのリモートプロシージャコールを提供していないため、更新を通知します。特定のステージへの書き込みが完了するまで待機する必要があります。
したがって、最も高速ですが、最も信頼性が低いのはSAFEであり、書き込みはメモリに対してのみ発生します。JOURNALは、少なくともディスクに書き込まれたというセキュリティを提供します。FSYNCを使用すると、これらの変更をディスク上のデータベースに保持できます。少なくとも2つのレプリカがそれを書き込んだREPLICA、およびレプリカの半分以上がそれを書き込んだMAJORITY(デフォルトであるはずの3つのレプリカによるこれは違いはありません)。

私が非同期のようなものを見る唯一のチャンスは、すべての書き込み操作を同期的に実行している別のスレッドを持つことです。このスレッドは、実際の更新と、この失敗を処理するために必要な操作の実行に失敗した場合に呼び出されるクラスを処理できます。しかし、これは良いアプリケーション設計ではないと思います。

于 2012-06-05T09:33:56.013 に答える
1

はい、エラーによっては、返されたエラーコードを確認しないと、サイレントに失敗する可能性があります。エラーチェックを待つ必要があります。他の唯一のオプションは、アプリがユーザーに「おっと、少し前にデータを保存したように振る舞ったときのことを覚えていますか?まあ、そうではありません」と時々ユーザーに伝えることです。

于 2012-06-05T07:57:04.093 に答える