Overview
すべてのMongoDBドライバーは、読み取りまたは書き込みのサーバーを選択するときに定義されたアルゴリズムに従います。 MongoDB Rustドライバーを使用すると、このアルゴリズムをカスタマイズして、アプリケーションに最適です。
サーバーの選択には次の方法で影響を与えます。
読み込み設定 (read preference)を使用して、プライマリ、セカンダリ、またはタグセットが最も近いサーバーなど、適切なサーバーを標準化された方法で記述します。
SelectionCriteria::Predicate経由でカスタム述語を提供し、適切なサーバーをフィルタリングするときに独自のロジックを適用します。
重要
サーバー選択アルゴリズムをカスタマイズすると、読み取りや書込みパフォーマンスの低下など、意図しない結果が生じる可能性があります。
カスタマイズされた選択アルゴリズム
Rustドライバーがカスタム選択基準で操作を実行する場合、 MongoDBデプロイ を選択するために次の手順を順番に実行します。
適格なサーバーを選択する: 既知のサーバーのリストから、ドライバーはアクティブな
SelectionCriteriatrueと一致するサーバーを選択します。読み込み設定 (read preference)に一致するサーバー、またはカスタム述語によって が返されるサーバーのいずれかです。レイテンシウィンドウを適用する: ドライバーは
local_threshold設定を適格なサーバーのリストに適用し、平均ラウンドトリップ時間が 最速の適格サーバーの構成ウィンドウ外のサーバーをフィルタリングします。ランダム選択: ドライバーはレイテンシウィンドウに残っているサーバーからランダムにサーバーを選択し、このサーバーに対して操作を実行します。
Rustドライバーが 書込み (write)操作 を実行する際、まず、アクティブな読み込み設定 (read preference)と一致するサーバーだけでなく、すべての書込み可能なサーバーを選択します。残りの手順は同一です。
デフォルトのサーバー選択アルゴリズムの詳細については、 MongoDB Serverマニュアルの サーバー選択アルゴリズムを参照してください。
選択基準と述語
Rustドライバーは、次の例に示すように、 SelectionCriteria列挙を使用してサーバー選択ルールを表します。
pub enum SelectionCriteria { ReadPreference(ReadPreference), Predicate(Predicate), }
どの操作にも、SelectionCriteria::ReadPreference または SelectionCriteria::Predicate のいずれかを使用します。両方は使用しません。
ReadPreference: 標準のMongoDB読み込み設定 (read preference) ) ルールに従い、サーバータイプ、タグ セット、最大古さに基づいて適切なサーバーを説明します。Predicate: ホスト名パターンやその他のカスタム条件に基づいてサーバーを優先するなど、ReadPreferenceが表現できないケースにカスタム ロジックを提供できます。
述語とは、ServerInfo参照を受け入れ、サーバーの適性を示す true を返す任意の閉じものです。ドライバーでは、次のコードに示すように、これを型エイリアス Predicate として定義します。
pub type Predicate = Arc<dyn Send + Sync + Fn(&ServerInfo) -> bool>;
述語がそのサーバーの ServerInfo 値に対して true を返す場合、そのサーバーは適切と見なされます。 ServerInfo タイプは、アドレス、タイプ、その他のモニタリングメタデータなど、サーバーに関する情報を公開します。
例: 述語を使用して localhost 上のサーバーを選択します
複数の mongos サーバーでシャーディングされたクラスターを使用する場合は、localhost で実行中配置の方が適している場合があります。これらの配置に対する操作では、レイテンシが低く、スループットが高くなります。この例では、localhost で実行中サーバーのみを考慮してサーバー選択アルゴリズムをカスタマイズする方法を示します。
述語関数の記述
述語関数は、次の条件を満たす必要があります。
パラメータとして
ServerInfoオブジェクトへの参照を受け入れますサーバーが選択に適しているかどうかを示すブール値を返します
ServerInfoオブジェクトを作成または変更しない
次の例では、ホスト アドレスが localhost であるサーバーを優先する述語を定義します。
let prefer_localhost = Arc::new(|server_info: &ServerInfo| { matches!( server_info.address(), ServerAddress::Tcp { host, .. } if host == "localhost" ) });
一致するサーバーがない場合の処理
述語が使用可能なすべてのサーバーに対して false を返す場合、ドライバーはサーバーを選択できません。この場合操作は失敗し、使用可能なサーバーが指定された条件に適していないことを示すサーバー選択タイムアウト エラーが返されます。
この結果を回避するには、述語が通常の条件下で少なくとも 1 つのサーバーと一致することを確認するか、 またはアプリケーションコードでサーバー選択エラーを処理し、必要に応じて制限的ではない SelectionCriteria で再試行します。
接続オプションでの述語の使用
サーバー選択に述語を使用するには、クライアントを作成する 際に、それを selection_criteria オプションに渡します。 [ :GUIラベル:非同期 ] タブまたは [ :GUIラベル:同期 ]タブを選択して、各実行時に対応するコードを表示します。
let prefer_localhost = Arc::new(|server_info: &ServerInfo| { matches!( server_info.address(), ServerAddress::Tcp { host, .. } if host == "localhost" ) }); let options = ClientOptions::builder() .hosts(vec![ServerAddress::Tcp { host: "<hostname>".to_string(), port: Some(27017), }]) .selection_criteria(SelectionCriteria::Predicate(prefer_localhost)) .build(); let client = Client::with_options(options)?;
let mut options = ClientOptions::parse( "mongodb://<db_username>:<db_password>@<hostname>:<port>", ) .await?; let prefer_localhost = Arc::new(|server_info: &ServerInfo| { matches!( server_info.address(), ServerAddress::Tcp { host, .. } if host == "localhost" ) }); options.selection_criteria = Some( SelectionCriteria::Predicate(prefer_localhost), ); let client = Client::with_options(options)?;
API ドキュメント
Rustドライバーの サーバー選択アルゴリズムをカスタマイズする方法の詳細については、次のAPIドキュメントを参照してください。