sql >> データベース >  >> NoSQL >> MongoDB

MongoDB+NodeJSを使用して一意のIDを生成する際の競合状態と飢餓への対処

    IDを保存するためにMongoDBを使用しています。状態です。 IDの生成は機能です。 mongodbプロセスが関数の引数を取り、生成されたIDを返すときに、Mongodbを使用してIDを生成します。それはあなたがしていることではありません。 nodejsを使用してIDを生成しています。

    スレッドの数、つまりイベントループはアーキテクチャを定義するため重要ですが、どちらの方法でもトランザクションは必要ありません。 mongodbのトランザクションは、複数のドキュメントを一度に一貫して更新することを目的としていることを強調するために、まさに「マルチドキュメントトランザクション」と呼ばれています。 https://docs.mongodb.com/manual/core/transactionsの最初の段落/ 単一のドキュメントを更新すると、トランザクションの余地がないことを警告します。

    シングルスレッドアプリケーションは同期を必要としません。開始時に最新の生成されたIDを確実に読み取り、そのIDがnodejsプロセス内で一意であることを保証できます。 mongodbおよびその他のI/Oを生成関数から除外すると、同期化されるため、nodejsプロセス内でIDの状態を維持し、その一意性を保証できます。生成されると、データベースに非同期で永続化できます。最悪のシナリオでは、連番にギャップがあるかもしれませんが、重複はありません。

    より多くの同時リクエストを処理するために複数のnodejsプロセスにスケールアップする必要があるか、将来的に冗長性のために別のホストを追加する必要がある可能性がわずかにある場合は、IDの生成を同期する必要があり、Mongodbの一意のインデックスを使用できます。それ。関数自体はあまり変更されませんが、シングルスレッドアーキテクチャのようにIDを生成しますが、IDをmongoに保存するための追加の手順を追加します。ドキュメントはIDフィールドに一意のインデックスを持っている必要があるため、同時更新の場合、クエリの1つはドキュメントを正常に追加し、別のクエリは「E11000重複キーエラー」で失敗します。 nodejs側でこのようなエラーをキャッチし、次の番号を選択して関数をもう一度繰り返します:



    1. タグ検索用のデータストアソリューション

    2. マングースはコールバックを送信していないすべてを見つけます

    3. ノードパスポートエラー:不明な認証戦略ローカルログイン

    4. クエリ結果に含まれないMongoDB入力データ