データサブスクリプションインスタンスを設定したら、Data Transmission Service (DTS) が提供する SDK サンプルコードを使用して変更データを消費してください。
手順
-
データソースが PolarDB-X 1.0 インスタンスまたは DMS 論理データベースの場合は、「SDK サンプルコードを使用した PolarDB-X 1.0 からのデータサブスクリプションデータの消費」をご参照ください。
-
RAM ユーザーを使用してデータを消費する場合、RAM ユーザーには AliyunDTSFullAccess 権限とサブスクリプションオブジェクトにアクセスするための権限が必要です。権限の付与方法の詳細については、「システムポリシーを使用した DTS インスタンスを管理するための RAM ユーザーの承認」および「RAM ユーザー権限の管理」をご参照ください。
-
各コンシューマーは独立して動作します。
-
このトピックでは、Java のサンプル SDK クライアントを提供しています。Python および Go のサンプルコードについては、「dts-subscribe-demo」をご参照ください。
次の手順では、IntelliJ IDEA (Community Edition 2020.1 for Windows) で SDK サンプルコードを実行してデータサブスクリプションデータを消費する方法を説明します。
-
データサブスクリプションインスタンスを作成します。詳細については、「ApsaraDB RDS for MySQL インスタンスのデータサブスクリプションチャネルの作成」、「PolarDB for MySQL クラスターのデータサブスクリプションチャネルの作成」、または「Oracle データベースのデータサブスクリプションチャネルの作成」をご参照ください。
-
1 つ以上のコンシューマーグループを作成します。詳細については、「コンシューマーグループの作成」をご参照ください。
重要データサブスクリプションデータを消費する場合、
DefaultUserRecordのcommitメソッドを呼び出してチェックポイントをコミットする必要があります。コミットしないと、データが重複して消費される可能性があります。 -
ビジネス要件に基づいて SDK サンプルコードを使用します。
-
新しいデータサブスクリプション SDK パッケージを使用する (推奨)
-
IntelliJ IDEA を開き、[Create New Project] をクリックして、アプリケーション用のプロジェクトを作成します。
-
プロジェクトで、プロジェクトオブジェクトモデル (POM) ファイル pom.xml を見つけます。
-
pom.xml ファイルに次の依存関係を追加します:
<dependency> <groupId>com.aliyun.dts</groupId> <artifactId>dts-new-subscribe-sdk</artifactId> <version>{dts_new_sdk_version}</version> </dependency>説明最新の Maven 依存関係は、dts-new-subscribe-sdk ページで確認できます。
-
新しいサブスクリプション SDK の使用方法の詳細については、「サンプルコードの使用」をご参照ください。
-
-
新しいデータサブスクリプション SDK のカスタマイズ版を使用する
-
SDK サンプルコードパッケージをダウンロードし、解凍します。
説明
をクリックし、[Download ZIP] を選択してパッケージをダウンロードします。 -
解凍した SDK サンプルコードのディレクトリに移動します。テキストエディターを使用して pom.xml ファイルを開き、データサブスクリプション SDK を最新バージョンに更新します。
重要データサブスクリプション SDK の最新バージョンは Maven の Web サイトから取得できます。詳細については、「データサブスクリプション SDK の Maven ページ」をご参照ください。
-
IntelliJ IDEA を開き、[Open or Import] をクリックします。

-
表示されるダイアログボックスで、解凍した SDK サンプルコードのディレクトリに移動し、フォルダーを展開して pom.xml ファイルを見つけます。

-
表示されるダイアログボックスで、[Open as Project] を選択します。
-
IntelliJ IDEA でフォルダーを展開します。SDK クライアントの使用モードに基づいて、対応する Java ファイル (DTSConsumerAssignDemo.java または DTSConsumerSubscribeDemo.java) を選択してダブルクリックします。
説明DTS は、次の SDK クライアント使用モードをサポートしています:
-
ASSIGN モード:メッセージのグローバルな順序を保証するため、DTS は各サブスクリプショントピックに 1 つのパーティション (パーティション 0) のみを割り当てます。ASSIGN モードで SDK クライアントを使用する場合、クライアントを 1 つのみ起動することを推奨します。
-
SUBSCRIBE モード:メッセージのグローバルな順序を保証するため、DTS は各サブスクリプショントピックに 1 つのパーティション (パーティション 0) のみを割り当てます。SUBSCRIBE モードで SDK クライアントを使用する場合、ディザスタリカバリのためにコンシューマーグループ内で複数の SDK クライアントを起動できます。アクティブなクライアントに障害が発生した場合、別の SDK クライアントが自動的にパーティション 0 に割り当てられ、消費を再開します。
-
-
-
-
Java ファイルで必要なパラメーターを設定します。

表 1. 必須パラメーター
パラメーター
説明
ソース
brokerUrlデータサブスクリプションインスタンスのエンドポイントとポート番号。
説明-
SDK クライアントを実行している ECS インスタンスとデータサブスクリプションインスタンスが同じクラシックネットワークまたは Virtual Private Cloud (VPC) にある場合は、ネットワークレイテンシを最小限に抑えるために、サブスクリプションに内部エンドポイントを使用することを推奨します。
ネットワークが不安定になる可能性があるため、パブリックエンドポイントの使用は推奨されません。
DTS コンソールで、対象のデータサブスクリプションインスタンスの ID をクリックします。基本情報 ページで、ネットワーク セクションのエンドポイントとポート番号を取得できます。
topicインスタンスのサブスクリプショントピック。
DTS コンソールで、対象のデータサブスクリプションインスタンスの ID をクリックします。基本情報 ページの 基本情報 セクションで トピック を取得できます。
sidコンシューマーグループの ID。
DTS コンソールで、ターゲットのデータサブスクリプションインスタンスの ID をクリックし、データ消費 をクリックします。コンシューマーグループの [コンシューマーグループ ID] と アカウント を取得できます。
説明コンシューマーグループのユーザー名のパスワードは、コンシューマーグループの作成時に指定します。
userNameコンシューマーグループのユーザー名。
警告このトピックで提供されるクライアントを使用しない場合は、ユーザー名を
<Username>-<Consumer Group ID>形式で設定する必要があります。例:dtstest-dtsae******bpv。そうしないと、接続は失敗します。passwordユーザー名のパスワード。
initCheckpointSDK クライアントがデータの消費を開始する消費チェックポイント。UNIX タイムスタンプとして指定します。例:1620962769。
説明消費チェックポイント情報は、次のシナリオで使用できます。
-
アプリケーションの中断後に消費を再開し、データ損失を防ぐには、最後に認識された消費チェックポイントを渡します。
-
クライアントの起動時に、特定の消費チェックポイントを渡して、目的の位置からデータを消費できます。
消費チェックポイントは、データサブスクリプションインスタンスのデータ範囲内 (図を参照) にある必要があり、UNIX タイムスタンプに変換する必要があります。
説明検索エンジンを使用して UNIX タイムスタンプコンバーターを見つけることができます。
ConsumerContext.ConsumerSubscribeMode subscribeModeSDK クライアントの使用モード。有効値:
-
ConsumerContext.ConsumerSubscribeMode.ASSIGN:ASSIGN モード。コンシューマーグループ内の 1 つの SDK クライアントのみがデータサブスクリプションデータを消費できます。 -
ConsumerContext.ConsumerSubscribeMode.SUBSCRIBE:SUBSCRIBE モード。ディザスタリカバリのために、同じコンシューマーグループで複数の SDK クライアントを起動できます。
N/A
-
-
IntelliJ IDEA の上部メニューで、 を選択してクライアントを実行します。
説明クライアントを初めて実行するとき、必要な依存関係が自動的にロードされてインストールされるまでに時間がかかる場合があります。
-
結果を次の図に示します。クライアントはソースデータベースから変更データを正常に消費します。

-
SDK クライアントは、送受信されたレコードの総数と総量、および 1 秒あたりのリクエスト数 (RPS) など、データ消費に関する統計を定期的に集計して表示します。

表 2. データ消費統計
パラメーター
説明
outCountsSDK クライアントが消費したデータレコードの総数。
outBytesSDK クライアントが消費したデータの総量。単位:バイト。
outRpsSDK クライアントがデータを消費する 1 秒あたりのリクエスト数 (RPS)。
outBpsSDK クライアントのデータ消費レート。単位:バイト/秒 (Bps)。
inBytesDTS サーバーが送信したデータの総量。単位:バイト。
DStoreRecordQueueDTS サーバーからの受信レコードのための内部データキャッシュキューのサイズ。
inCountsDTS サーバーが送信したデータレコードの総数。
inRpsDTS サーバーがデータを送信する RPS。
__dtSDK クライアントがデータを受信したときのタイムスタンプ。単位:ミリ秒。
DefaultUserRecordQueueコンシューマーアプリケーションで処理可能なレコードを保持するデータキューのサイズ。
-
消費チェックポイントの保存とクエリ
データ消費を開始または再開する (初回起動、再起動、内部リトライなど) には、SDK クライアントに消費チェックポイントが必要です。次の表では、データ損失の防止、重複消費の最小化、オンデマンド消費の実現を目的に、シナリオ別のチェックポイントの管理方法とクエリ方法を示します。
|
シナリオ |
SDK 使用モード |
クエリ方法 |
|
消費チェックポイントのクエリ |
ASSIGN モード、SUBSCRIBE モード |
|
|
初回起動:チェックポイントを渡して消費を開始 |
ASSIGN モード、SUBSCRIBE モード |
SDK クライアントの使用モードに基づいて DTSConsumerAssignDemo.java または DTSConsumerSubscribeDemo.java ファイルを選択し、 |
|
SDK クライアントが内部リトライ後に消費を継続するには、最後に記録された消費チェックポイントを再度渡す必要があります。 |
ASSIGN モード |
次の順序で、最後に記録された消費チェックポイントを検索します。見つかった時点で検索を終了し、チェックポイント情報を返します。
|
|
SUBSCRIBE モード |
次の順序で、最後に記録された消費チェックポイントを検索します。見つかった時点で検索を終了し、チェックポイント情報を返します。
|
|
|
SDK クライアントの再起動後、消費を継続するには、最後に記録された消費チェックポイントを再度渡す必要があります。 |
ASSIGN モード |
consumerContext.java ファイルの
|
|
SUBSCRIBE モード |
このモードでは、consumerContext.java ファイルの
|
消費チェックポイントの永続化
増分データ収集モジュールでディザスタリカバリ イベントが発生した場合 (特に SUBSCRIBE モードの場合)、新しいモジュールはクライアントの最新の消費チェックポイントを保持しません。クライアントは古いチェックポイントから再開する可能性があり、履歴データの重複消費が発生します。例えば、切り替え前に、古いモジュールのチェックポイント範囲が 2023 年 11 月 11 日 08:00:00 から 2023 年 11 月 12 日 08:00:00 で、クライアントのチェックポイントが 2023 年 11 月 12 日 08:00:00 だったとします。切り替え後、新しいモジュールのチェックポイント範囲は 2023 年 11 月 08 日 10:00:00 から 2023 年 11 月 12 日 08:01:00 になります。クライアントは新しいモジュールの開始チェックポイント (2023 年 11 月 08 日 10:00:00) から開始するため、重複消費が発生します。
このシナリオでの重複消費を回避するには、クライアント側で永続チェックポイントストアを構成してください。次の例は、要件に応じて調整できる実装の 1 つを示しています。
-
AbstractUserMetaStoreを継承するUserMetaStoreクラスを作成してください。例えば、MySQL データベースにチェックポイント情報を保存する場合は、次の Java コードを使用してください。
public class UserMetaStore extends AbstractUserMetaStore { @Override protected void saveData(String groupID, String toStoreJson) { Connection con = getConnection(); String sql = "insert into dts_checkpoint(group_id, checkpoint) values(?, ?)"; PreparedStatement pres = null; ResultSet rs = null; try { pres = con.prepareStatement(sql); pres.setString(1, groupID); pres.setString(2, toStoreJson); pres.execute(); } catch (Exception e) { e.printStackTrace(); } finally { close(rs, pres, con); } } @Override protected String getData(String groupID) { Connection con = getConnection(); String sql = "select checkpoint from dts_checkpoint where group_id = ?"; PreparedStatement pres = null; ResultSet rs = null; String checkpoint = null; try { pres = con.prepareStatement(sql); pres.setString(1, groupID); rs = pres.executeQuery(); if (rs.next()) { checkpoint = rs.getString("checkpoint"); } } catch (Exception e) { e.printStackTrace(); } finally { close(rs, pres, con); } return checkpoint; } } -
consumerContext.java ファイルで、
setUserRegisteredStore(new UserMetaStore())メソッドを使用して外部ストレージを構成してください。
よくある質問
-
データサブスクリプションインスタンスの接続の問題はどのように解決できますか。
エラーメッセージに基づいてトラブルシューティングを行ってください。詳細については、「トラブルシューティング」をご参照ください。
-
消費チェックポイントはどのフォーマットで永続化されますか。
永続化された消費チェックポイントデータは JSON フォーマットで保存されます。永続化されたチェックポイントは UNIX タイムスタンプで、 SDK に直接渡すことができます。次の応答例では、
"timestamp"キーの値1700709977が、永続化された消費チェックポイントです。{"groupID":"dtsglg11d48230***","streamCheckpoint":[{"partition":0,"offset":577989,"topic":"ap_southeast_1_vpc_rm_t4n22s21iysr6****_root_version2","timestamp":1700709977,"info":""}]}
トラブルシューティング
|
問題 |
エラーメッセージ |
原因 |
解決策 |
|
接続できません |
|
指定された |
|
|
ブローカーアドレスが実際の IP アドレスに接続できません。 |
||
|
ユーザー名またはパスワードが正しくありません。 |
||
|
consumerContext.java ファイルでは、 |
データサブスクリプションインスタンスのデータ範囲内にある消費チェックポイントを渡してください。詳細については、「必須パラメーター」をご参照ください。 |
|
|
消費の遅延 |
N/A |
|
|