kv_create_version_consistency()

#include <kvstore.h>

kv_error_t
kv_create_version_consistency(kv_consistency_t **consistency,
                              const kv_version_t *version,
                              kv_timeout_t timeout_ms) 

レプリカ・ノードの環境が少なくとも指定されたversionで示される現在の状態であることを保証する一貫性ポリシーを作成します。versionは、Key/ValueペアのValue部分をkv_get_version()に提供することによって作成されるか、kv_result_get_version()またはkv_result_get_previous_version()に提供される結果セットから取得されます。バージョンは、kv_put_with_options()関数のnew_versionパラメータでも返されます。

Key-Valueペアのバージョンは、マスターによって作成された、シリアライズ済トランザクション・スケジュール内のポイントを表します。つまり、versionは、レプリケーション・ストリームでの特定のトランザクションのコミットを表すブックマークに似ています。レプリカは、レプリカ上のトランザクションが続行可能になる前にversionによって識別されたコミットが実行されていることを確認します。

たとえば、アプリケーションがWebアプリケーションであるとします。Webサーバーへの各要求は、(たとえば、同じクライアントからの)更新操作とその後の読取り操作で構成されます。読取り操作は、通常、同じ要求によって実行された更新のデータが存在することを想定しています。ただし、読取り操作は、更新を実行しなかったレプリカ・ノードにルーティングされている可能性があります。

このような場合、更新要求によってversionが生成され、これがブラウザによって再送信され、後続の読取り要求とともにKVストアに渡されます。読取り要求は、KVストアのロード・バランサによって使用可能なレプリカのいずれかに送信される場合があります。要求を処理するレプリカが(バージョン・トークンに関して)すでに最新である場合は、即座にトランザクションが実行され、要求が満たされます。そうでない場合、レプリカのリプレイがキャッチアップされ、そのノードで変更内容が利用可能になるまで、トランザクションは停止します。

一貫性構造に割り当てられたメモリーを解放するには、kv_release_consistency()を使用します。

パラメータ

  • consistency

    consistencyパラメータは、割り当てられた一貫性ポリシーへのポインタのコピー先であるメモリーを参照します。

  • version

    versionパラメータは、レプリカが最新であるとみなされるためにレプリカに存在する必要のあるバージョンを識別します。この値は、Key/ValueペアのValue部分をkv_get_version()に提供することによって作成されるか、kv_result_get_version()またはkv_result_get_previous_version()に提供される結果セットから取得されます。

  • timeout_ms

    timeout_msパラメータは、レプリカで目標とする一貫性の確保を中断せず、待機できる時間を指定します。

    一貫性ポリシーを満たすために、KVStoreクライアント・ドライバは、適切なレプリケーション・グループからノード(通常はレプリカ)を選択し、これに要求を送信することにより、読取り操作を実装します。レプリカが整合性のタイムアウト時間内に目標とする一貫性を保証できない場合は、要求に応答して失敗したことを示します。操作のタイムアウトまでにまだ時間が残っている場合、クライアント・ドライバは別のノードを選択し、要求を再試行します(アプリケーションに対して透過的)。

    一貫性ポリシーを受け入れるKVStore操作は、個別の操作タイムアウトも受け入れます。操作タイムアウトとは、操作が完了するまでアプリケーションが自発的に待機する最大時間であるとみなすことができます。一方、一貫性タイムアウトは実装に対するパフォーマンスに関するヒントのようなものです。これが示唆するのは、通常、正常なレプリカであれば一定時間内に一貫性を確保できることを想定でき、そうでない場合は、要求試行を中止して別のレプリカで再試行するオーバーヘッドを受け入れる価値がある可能性が高いということです。一貫性タイムアウトを意味あるものにするには、操作タイムアウトよりも短くする必要があります。

    操作タイムアウト値の選択は、アプリケーションのニーズによって異なります。適切な一貫性タイムアウト値を見つけられるかどうかは、実際のシステム・パフォーマンスで行われた観察結果に依存する可能性が高くなります。