バージョンベースの一貫性の使用
バージョンベースの一貫性は、各操作ベースで使用されます。レプリカで行われる読取りが、少なくとも、マスターで以前に行われた書込み程度に最新であることが保証されます。
これが使用される場合の1つの例は、顧客からの情報(名前など)を収集するWebアプリケーションです。そして、その名前の顧客に対して表示されるすべての後続ページをカスタマイズします。顧客の名前の格納は、マスター・ノードによってのみ実行できる書込み操作ですが、後続ページの作成は、ストア内のいずれのノードでも起こる読取り専用操作として実行されます。
この一貫性ポリシーを使用するには、アプリケーション内のプロセス間でバージョン情報が転送される必要があります。
バージョンベースの一貫性ポリシーを作成するには、Consistency.Version
クラスを使用します。 これを行う場合、次の情報を指定する必要があります。
-
version
読取りで一致する必要のある
Version
。 -
timeout
version要件を満たすためにレプリカが待機できる時間を表す
long
。つまり、レプリカがversion要件をすぐには満たさない場合、マスターからの必要なデータで更新されるかどうかをこの時間の間待ちます。レプリカがtimeout期間内に要件を満たさない場合、ConsistencyException
がスローされます。 -
timeoutUnit
timeout
で使用される単位を表すTimeUnit
。たとえば、TimeUnit.SECONDS
です。
たとえば、次のコードでは、ストア書込みを行い、バージョン情報を収集して、バージョンベースの一貫性ポリシーの作成に使用します。 この例では、汎用のAvroバインディングを使用して、人の情報を格納することを想定しています。
package kvstore.basicExample;
...
import oracle.kv.Key;
import oracle.kv.Value;
import oracle.kv.Version;
import java.util.ArrayList;
import org.apache.avro.Schema;
import oracle.kv.avro.GenericAvroBinding;
import oracle.kv.avro.GenericRecord;
...
ArrayList<String> majorComponents = new ArrayList<String>();
...
// Define the major path components for the key
majorComponents.add("Smith");
majorComponents.add("Bob");
// Create the key
Key myKey = Key.createKey(majorComponents);
...
// Binding and schema creation omitted
...
final GenericRecord person = new GenericData.Record(personSchema);
person.put("ID", 100011);
person.put("FamiliarName", "Bob");
person.put("Surname", "Smith");
person.put("PrimaryPhone", "408 555 5555");
Value myValue = binding.toValue(person);
// Now put the record. Note that we do not show the creation of the
// kvstore handle here.
Version matchVersion = kvstore.put(myKey, myValue);
このアプリケーション・コードの別の箇所、あるいはまったく別のアプリケーションで、上で取得したmatchVersion
を使用してバージョンベースの一貫性ポリシーを作成します。
package kvstore.basicExample;
...
import oracle.kv.Consistency;
import oracle.kv.ConsistencyException;
import oracle.kv.Key;
import oracle.kv.Value;
import oracle.kv.ValueVersion;
import oracle.kv.Version;
import org.apache.avro.Schema;
import oracle.kv.avro.GenericAvroBinding;
import oracle.kv.avro.GenericRecord;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
...
ArrayList<String> majorComponents = new ArrayList<String>();
...
// Define the major path components for the key
majorComponents.add("Smith");
majorComponents.add("Bob");
// Create the key
Key myKey = Key.createKey(majorComponents);
// Create the consistency policy using the
// Version object we captured, above.
Consistency.Version versionConsistency =
new Consistency.Version(matchVersion,
200,
TimeUnit.NANOSECONDS);
// Now retrieve the record. Note that we do not show the creation of
// the kvstore handle here.
try {
ValueVersion vv = kvstore.get(myKey,
versionConsistency,
0, // Timeout parameter.
// 0 means use the default.
null); // Timeout units. Null because
// the Timeout is 0.
// Deserialize with our generic avro binding
// (creation of this binding is not shown).
final GenericRecord member = binding.toObject(vv.getValue());
// Do work with the generic record here.
} catch (ConsistencyException ce) {
// The consistency guarantee was not met
}