オンラインアプリケーションでカウンターを実装する場合、アトミックカウンター機能を使用できます。この機能を使用するには、列をアトミックカウンターとして設定し、その列でアトミックカウンター操作を実行します。
シナリオ
アトミックカウンターは、さまざまなトピックでのリアルタイムのページビュー (PV) 数のカウント、一部のオンラインアプリケーションでのメッセージ数のカウント、特定の列の値を 1 ずつ増加させるなど、カウント操作を迅速に実行する必要があるシナリオに適しています。
概要
アトミックカウンターは、強力な整合性によって引き起こされる書き込みパフォーマンスのオーバーヘッドを削減します。サーバーに読み取り、変更、書き込み (RMW) 操作を実行するリクエストを送信すると、サーバーは行をロックしてその行で操作を実行します。データの強力な整合性を確保するために、データベースサーバーでアトミックカウンターを更新することで、書き込みパフォーマンスを向上させることができます。
アトミックカウンター操作でネットワークタイムアウトやシステム障害が発生した場合、エラーが発生する可能性があります。この場合、操作を再試行できます。ただし、アトミックカウンターが 2 回更新されてしまい、値が想定より小さくなったり、大きくなったりする可能性があります。条件付き更新機能を使用して、アトミックカウンターの値を正確に更新することを推奨します。詳細については、「条件付き更新」をご参照ください。
アトミックカウンター機能を使用して、行のデータに関するリアルタイムの統計を収集できます。アトミックカウンター機能を実装するには、UpdateRow API を呼び出して、アトミックカウンター値のインクリメントやデクリメント、更新された値の返却といった操作を実行します。
たとえば、Tablestore テーブルを作成して画像のメタデータを格納し、画像の数をカウントするとします。テーブルの各行にはユーザーIDがあります。行のある列で画像のメタデータを格納し、別の列をアトミックカウンターとして使用して、その行にメタデータが格納されている画像の数をリアルタイムでカウントします。
-
UpdateRow API を呼び出して画像のメタデータをある行に追加すると、アトミックカウンターの値は 1 増加します。
-
UpdateRow API を呼び出してある行から画像のメタデータを削除すると、アトミックカウンターの値は 1 減少します。
-
GetRow API を呼び出してアトミックカウンターの値を読み取り、その行にメタデータが格納されている画像の数を取得できます。
これにより、データベースの強力な整合性が保証されます。ある行に画像のメタデータを追加すると、その行のアトミックカウンターの値は必ず 1 増加します。
使用上の注意
-
アトミックカウンターは INTEGER 列でのみ実装できます。
-
アトミックカウンターとして指定された列がデータ書き込み前に存在しない場合、その列のデフォルト値は 0 になります。アトミックカウンターとして指定された列が INTEGER 列でない場合、OTSParameterInvalid エラーが発生します。
-
アトミックカウンターは正または負の数で更新できますが、整数オーバーフローを避ける必要があります。整数オーバーフローが発生した場合、OTSParameterInvalid エラーが返されます。
-
デフォルトでは、行更新リクエストのレスポンスではアトミックカウンターの値は返されません。更新されたアトミックカウンターの値を返すように指定できます。
-
単一の更新リクエストで、ある列をアトミックカウンターとして指定し、同時にその列を更新することはできません。たとえば、列 A をアトミックカウンターに設定した場合、同時にその列に上書きや削除などの他の操作を実行することはできません。
-
BatchWriteRow リクエストを送信することで、同じ行に複数の更新操作を実行できます。ただし、ある行でアトミックカウンター操作を実行する場合、BatchWriteRow リクエストではその行に 1 つの更新操作しか実行できません。
-
アトミックカウンターの最新バージョンの値のみ更新できます。指定したバージョンのアトミックカウンターの値を更新することはできません。更新操作が完了すると、行のアトミックカウンターに新しいバージョンのデータが挿入されます。
方法
アトミックカウンター機能は、Tablestore SDK でのみ利用できます。
アトミックカウンター機能は、Tablestore SDK for Java、Tablestore SDK for Go、Tablestore SDK for Python、Tablestore SDK for Node.js、Tablestore SDK for .NET、およびTablestore SDK for PHP で利用できます。この例では、Tablestore SDK for Java を使用します。
次のコードは、rowUpdateChange を使用してアトミックカウンターの値を増加させ、増加した値を返す例を示しています。
private static void incrementByUpdateRowApi(SyncClient client) {
// プライマリキーを指定します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString("pk0"));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// テーブルを指定します。
RowUpdateChange rowUpdateChange = new RowUpdateChange(TABLE_NAME, primaryKey);
// price 列をアトミックカウンターとして設定し、アトミックカウンターの値を 10 増加させます。タイムスタンプは指定できません。
rowUpdateChange.increment(new Column("price", ColumnValue.fromLong(10)));
// 返す値のデータ型を ReturnType.RT_AFTER_MODIFY に設定し、アトミックカウンターの値を返します。
rowUpdateChange.addReturnColumn("price");
rowUpdateChange.setReturnType(ReturnType.RT_AFTER_MODIFY);
// 行を更新するリクエストを送信します。
UpdateRowResponse response = client.updateRow(new UpdateRowRequest(rowUpdateChange));
// 更新された値を表示します。
Row row = response.getRow();
System.out.println(row);
}
課金
アトミックカウンターの実装は、既存の課金ルールには影響しません。課金の詳細については、「課金概要」をご参照ください。