オンラインアプリケーションのカウンターを実装する場合、アトミックカウンター機能を使用できます。この機能を使用するには、列をアトミックカウンターとして設定し、その列に対してアトミックカウンター操作を実行します。
シナリオ
アトミックカウンターは、さまざまなトピックのリアルタイムページビュー(PV)数や一部のオンラインアプリケーションのメッセージ数など、カウント操作を迅速に実行する必要があるシナリオに適しています。
概要
アトミックカウンターは、強い整合性によって発生する書き込みパフォーマンスのオーバーヘッドを削減します。サーバーにリクエストを送信して読み取り、変更、書き込み(RMW)操作を実行すると、サーバーは行をロックして行に対して操作を実行します。強力なデータ整合性を確保するために、データベースサーバー上のアトミックカウンターを更新して書き込みパフォーマンスを向上させることができます。
アトミックカウンター操作でネットワークタイムアウトまたはシステム障害が発生した場合、エラーが発生する可能性があります。この場合、操作を再試行できます。ただし、アトミックカウンターが2回更新される可能性があり、その結果、アトミックカウンターの値が小さくなったり大きくなったりする可能性があります。条件付き更新機能を使用して、アトミックカウンターの値を正確に更新することをお勧めします。詳細については、条件付き更新を参照してください。
アトミックカウンター機能を使用して、行のデータに関するリアルタイム統計を収集できます。アトミックカウンター機能を実装するには、UpdateRow操作を呼び出して、アトミックカウンターの値の増減や更新されたアトミックカウンターの値の返却など、アトミックカウンターに対する操作を実行できます。
たとえば、画像のメタデータを保存し、画像の数をカウントするためにTablestoreテーブルを作成します。テーブルの各行にはユーザーIDがあります。行の1つの列は、画像のメタデータを保存するために使用されます。行の別の列は、行にメタデータが保存されている画像のリアルタイム数をカウントするためのアトミックカウンターとして使用されます。
UpdateRow操作を呼び出して画像のメタデータを行に追加すると、アトミックカウンターの値が1ずつ増加します。
UpdateRow操作を呼び出して行から画像のメタデータを削除すると、アトミックカウンターの値が1ずつ減少します。
GetRow操作を呼び出してアトミックカウンターの値を読み取り、行にメタデータが保存されている画像の数を取得できます。
これにより、強力なデータベース整合性が確保されます。行に画像のメタデータを追加すると、行のアトミックカウンターの値は1ずつ減少するのではなく、1ずつ増加します。
使用上の注意
アトミックカウンターは、INTEGER型の列にのみ実装できます。
アトミックカウンターとして指定された列がデータの書き込み前に存在しない場合、列のデフォルト値は0です。アトミックカウンターとして指定された列がINTEGER型の列でない場合、OTSParameterInvalidエラーが発生します。
正または負の数を使用してアトミックカウンターを更新できますが、整数のオーバーフローは避ける必要があります。整数のオーバーフローが発生した場合、OTSParameterInvalidエラーが返されます。
デフォルトでは、アトミックカウンターの値は、行更新リクエストへのレスポンスでは返されません。更新されたアトミックカウンターの値が返されるように指定できます。
1つの更新リクエストで、列をアトミックカウンターとして指定し、その列を更新することはできません。たとえば、列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);
}
課金
アトミックカウンターの実装は、既存の課金ルールには影響しません。課金の詳細については、課金概要を参照してください。