このトピックでは、ソーステーブルに対する操作によって発生するデータ変更の同期、さまざまなトピックタイプのシャーディング戦略、データ形式、およびサンプルメッセージについて説明します。
ソーステーブルに対する操作によって発生するデータ変更の同期のさまざまなトピックタイプのサポート
トピックは、DataHub でのデータのサブスクリプションとパブリケーションの最小単位です。 トピックを使用して、さまざまなタイプのストリーミングデータを区別できます。 TUPLE とバイナリラージオブジェクト(BLOB)の 2 つのタイプのトピックがサポートされています。| トピックタイプ | DML メッセージをトピックに書き込む | アップストリームハートビートメッセージをトピックに書き込む | DDL メッセージをトピックに書き込む | ソーステーブルとトピックのマッピングモード | データ型 |
| TUPLE | サポート | サポート対象外 | サポート対象外 | 単一テーブルから単一トピック | DataHub でサポートされているデータ型 |
| BLOB | サポート | サポート | サポート | 単一データベース(複数テーブル)から単一トピック | BLOB データ |
- TUPLE トピックを作成した後、トピックのスキーマで定義したフィールドを変更することはできません。 したがって、TUPLE トピックは、ソーステーブルのスキーマが固定されており、ADD COLUMN や DROP COLUMN などのテーブルのスキーマを変更する DDL 操作がソーステーブルで実行されないシナリオに適しています。 TUPLE トピックは、ソーステーブルから送信される DDL メッセージまたはハートビートメッセージを同期できないため、DDL メッセージとハートビートメッセージを宛先に透過的に送信することはできません。 ソーステーブルとトピックのマッピングモードは 1 対 1 マッピングです。 多数のソーステーブルのデータを DataHub に書き込む場合は、DataHub に同じ数のトピックを作成する必要があります。 これは、宛先によるデータの消費を容易にするものではありません。
- BLOB トピックにはスキーマがなく、BLOB データのみを格納します。 BLOB トピックは、ソーステーブルから送信される DDL メッセージとハートビートメッセージを同期でき、DDL メッセージとハートビートメッセージを宛先に送信して消費できます。 ソーステーブルとトピックのマッピングモードは、データベース内の複数のテーブルが単一のトピックにマッピングされることです。 データを読み取る複数のソーステーブルに対して、単一のトピックを作成するだけで済みます。 これは、宛先によるデータの消費を容易にするものです。 DataHub を中間メッセージキューとして使用してデータベース内のすべてのデータを移行するシナリオでは、BLOB トピックを使用することをお勧めします。
さまざまなトピックタイプのシャーディング戦略
シャードは、トピック内のデータ送信に使用される同時チャネルです。 単一シャードがトピックにメッセージを書き込む速度は制限されています。 複数のシャードを追加して、書き込みパフォーマンスを向上させることができます。 ただし、DataHub は、単一のシャードが追加されている場合にのみ、メッセージ消費の順序を保証できます。 複数のシャードが追加されている場合、DataHub はシャード間のメッセージ消費の順序を保証できません。 次の表では、さまざまなトピックタイプのシャーディング戦略について説明し、次の効果を実現します。より多くのシャードを追加して書き込みパフォーマンスを向上させ、シャード間のメッセージ消費の順序を確保し、データの偏りを防ぐことができます。
| シナリオ | TUPLE | BLOB |
| 主キーが存在します。 カスタム主キーを指定できます。 | 書き込むメッセージは、主キーによってシャーディングされます。 | 書き込むメッセージは、主キーによってシャーディングされます。 |
| メッセージ消費の順序を確保する必要があります。 | 同じ主キー値を持つメッセージは順番に消費されます。 | 同じ主キー値を持つメッセージは順番に消費されます。 |
| 主キーが存在しません。 | 書き込むメッセージは、ランダムな列によってシャーディングされます。 | 書き込むメッセージは、テーブル名によってシャーディングされます。 |
| メッセージ消費の順序を確保する必要があります。 | メッセージ消費の順序は保証できません。 | 同じテーブルに属するメッセージは順番に消費されます。 |
データ形式
- TUPLEData Integration でトピックを作成すると、特定のメタデータ列が自動的に追加されます。
_sequence_id_、_excute_time_、_source_table_、_before_image_、および_after_image_はメタデータ列です。
例: 次の表は、INSERT ステートメント、UPDATE BEFORE ステートメント、UPDATE AFTER ステートメント、および DELETE ステートメントがソーステーブルで実行された後に DataHub に同期されるデータ変更結果のメタデータ列を示しています。パラメータ 説明 _sequence_id_ 各メッセージの一意の ID。 パラメータの値は STRING 型で、数字で構成されます。 メッセージの ID は、更新前操作と更新後操作で同じです。 _excute_time_ データが生成された時刻。 _source_table_ ソーステーブルの名前。 _before_image_ プリイメージ。 パラメータの値は、削除操作または更新前操作の場合は Y です。 パラメータの値は、挿入操作または更新後操作の場合は N です。 _after_image_ ポストイメージ。 パラメータの値は、削除操作または更新前操作の場合は N です。 パラメータの値は、挿入操作または更新後操作の場合は Y です。 _sequence_id_ _operation_type_ _excute_time_ _before_image_ _after_image_ 1649991610688000000 I 1649991726000 N Y 1649991610688000001 U 1649991756000 Y N 1649991610688000001 U 1649991756000 N Y 1649991610688000002 D 1649991774000 Y N - BLOBBLOB トピックのメッセージは、JSON 形式の文字列を変換することで取得されるバイナリデータです。 次のサンプルコードは、JSON 形式の文字列を示しています:
{ "schema": { // 変更が加えられたメタデータ。 列名と列のデータ型のみが指定されます。 "dataColumn": [// 変更が加えられた列。 宛先テーブルのデータは自動的に更新されます。 { "name": "id", // 列名 "type": "LONG" // データ型 }, { "name": "name", // 列名 "type": "STRING" // データ型 }, { "name": "binData", // 列名 "type": "BYTES" // データ型 }, { "name": "ts", // 列名 "type": "DATE" // データ型 } ], "primaryKey": [ // 主キー "pkName1", "pkName2" ], "source": { // ソース情報 "dbType": "mysql", // データベースタイプ "dbVersion": "1.0.0", // データベースバージョン "dbName": "myDatabase", // データベース名 "schemaName": "mySchema", // スキーマ名 "tableName": "tableName" // テーブル名 } }, "payload": { // ペイロード "before": { // 変更前のデータ "dataColumn":{ "id": 111, "name":"scooter", "binData": "[base64 string]", "ts": 1590315269000 } }, "after": { // 変更後のデータ "dataColumn":{ "id": 222, "name":"donald", "binData": "[base64 string]", "ts": 1590315269000 } }, "sequenceId":XXX// 増分データとフルデータをマージした後に生成される各メッセージの一意のシーケンスID。 パラメータの値はSTRING型です。 "op": "INSERT/UPDATE/DELETE/TRANSACTION_BEGIN/TRANSACTION_END/CREATE/ALTER/ERASE/QUERY/TRUNCATE/RENAME/CINDEX/DINDEX/GTID/XACOMMIT/XAROLLBACK/MHEARTBEAT..."// 実行される操作。 パラメータの値は大文字と小文字が区別されます。 "timestamp": { // タイムスタンプ "eventTime": 1,// 必須。 操作が実行された時刻。 パラメータの値はミリ秒単位の13桁のタイムスタンプです。 "systemTime": 2,// オプション。 Oracleなどの特定のデータソースに指定する必要があるシステム時刻。 "checkpointTime": 3// オプション。 ApsaraDB for OceanBaseなどの特定のデータソースに指定する必要があるチェックポイント時刻。 }, "ddl": { // DDL情報 "text": "ADD COLUMN ...", // DDLステートメントのテキスト "ddlMeta": "[SQLStatement serialized binary, expressed in base64 string]" // Base64文字列で表現された、シリアル化されたSQLStatementバイナリ } }, "version":"1.0.0" // バージョン }- BLOB トピックのフィールドの説明重要 メッセージのフィールドでは、次のデータ型がサポートされています。BOOLEAN、DOUBLE、DATE、BYTES、LONG、および STRING。
BOOLEAN: このデータ型のフィールドの有効な値はtrueとfalseです。 DATE: このデータ型のフィールドの値は、ミリ秒単位の13桁のタイムスタンプです。 BYTES: このデータ型のフィールドの値は、Base64エンコードされた文字列です。 Base64のエンコードとデコードは、java.util.Base64によって提供されるAPI操作を呼び出すことによって実装されます。 String text = "Test text123"; // テキスト // エンコード Base64.getEncoder().encodeToString(text.getBytes("UTF-8")) // エンコード Base64.getDecoder().decode(encodedText)// デコードレベル 1 フィールド レベル 2 フィールド 説明 schema dataColumn 列の名前とデータ型。 値は JSONArray 型です。 dataColumn は、ソースで更新される列の名前とデータ型を記録します。 変更操作は、データの追加、削除、変更、またはソースのテーブルスキーマの変更です。 - name: 列の名前。
- type: 列のデータ型。
primaryKey 主キーに関する情報。 値は List 型です。 pk: 主キーの名前。
source ソースまたはソーステーブルに関する情報。 値は Object 型です。 - dbType: ソースのタイプ。 値は STRING 型です。
- dbVersion: ソースのバージョン。 値は STRING 型です。
- dbName: ソースの名前。 値は STRING 型です。
- schemaName: スキーマの名前。 PostgreSQL や SQL Server などのソースには、このフィールドを指定する必要があります。 値は STRING 型です。
- tableName: ソーステーブルの名前。 値は STRING 型です。
payload before 変更前のデータ。 値は JSONObject 型です。 たとえば、MySQL データベースがソースであり、このソースのデータが更新された場合、before フィールドには更新前のデータが記録されます。 - データ更新または削除メッセージがソースから読み取られた後、before フィールドは書き込みレコードに指定されます。
- dataColumn: 列情報。 値は JSONObject 型です。 フィールド値は 列名:列値 形式です。 列名は文字列です。 列に指定されたデータ型が BYTES の場合、列値は Base64 エンコードされた文字列です。 列に指定されたデータ型が DATE の場合、列値は LONG 型の 13 桁のタイムスタンプです。
after 変更後のデータ。 after フィールドは、before フィールドと同じデータ形式で変更後のデータを記録します。 説明 このフィールドは、更新または挿入操作が実行されたときに必須です。op 操作のタイプ。 有効な値: - INSERT: データを挿入します。
- UPDATE_BEFOR: データを更新します(前)。
- UPDATE_AFTER: データを更新します(後)。
- DELETE: データを削除します。
- TRANSACTION_BEGIN: データソーストランザクションを開始します。
- TRANSACTION_END: データソーストランザクションを終了します。
- CREATE: データソースにテーブルを作成します。
- ALTER: データソースのテーブルを変更します。
- QUERY: データ変更を引き起こす SQL ステートメントを実行することにより、データベース内のデータ変更をクエリします。
- TRUNCATE: データソースのテーブルからすべての行を削除します。
- RENAME: データソースのテーブルの名前を変更します。
- CINDEX: インデックスを作成します。
- DINDEX: インデックスを削除します。
- MHEARTBEAT: ハートビートメッセージ。 このメッセージは、ソースで新しいデータが生成されていないときに同期ノードが予期どおりに実行されていることを示します。
timestamp データレコードのタイムスタンプ。 値は JSONObject 型です。 - eventTime: ソースのデータが変更された時刻。 値はミリ秒単位の 13 桁のタイムスタンプで、LONG 型です。
- systemTime: 同期ノードが変更メッセージを読み取る時刻。 値はミリ秒単位の 13 桁のタイムスタンプで、LONG 型です。
- checkpointTime: 同期オフセットがリセットされる指定時刻。 値はミリ秒単位の 13 桁のタイムスタンプで、LONG 型です。 ほとんどの場合、このフィールドの値は eventTime フィールドの値と同じです。
ddl このフィールドは、ソースのテーブルのスキーマが変更された場合にのみ指定されます。 ソースでデータの追加、削除、または変更などの DDL 操作が実行された場合、値は null です。 - text: ソースの DDL ステートメントのテキスト。 値は STRING 型です。
- ddlMeta: FastSQL を使用して DDL ステートメントを解析した後に生成される SQL ステートメントオブジェクトをシリアル化することで取得されるバイナリデータ。 バイナリデータは Base64 エンコードされた文字列として格納されます。 ddlMeta の値は STRING 型です。
DDL サポートを有効にすると、宛先はシリアル化された SQL ステートメントオブジェクトを逆シリアル化して、オブジェクトをトピックで実行できる DDL ステートメントに復元します。
version なし JSON 形式のデータのバージョン。 - BLOB データのデータのシリアル化の説明
このトピックでは、メッセージは JSON オブジェクトにマッピングされます。 JSON オブジェクトはキーと値のペアで構成されます。 各キーと値のペアの value パラメータの値は、メッセージ形式に基づいて、JSON オブジェクト、JSON 配列、または特定のデータ型の値にすることができます。
JSON オブジェクトの各フィールドのストレージデータ型は、上記のフィールドの説明に基づいています。 JSON オブジェクトをシリアル化して文字列に変換できます。 変換には、Fastjson によって提供される toJSONString メソッドを使用できます。 その後、文字列によって提供される getBytes(Charsets.UTF_8) メソッドを使用して、UTF-8 形式の指定された文字セットを byte[] に変換できます。
- BLOB トピックのフィールドの説明
関連メッセージのサンプル JSON データ
- INSERT:
{ "schema": { // スキーマ "dataColumn": [ // データ列 { "name": "id", // 列名 "type": "LONG" // データ型 }, { "name": "name", // 列名 "type": "STRING" // データ型 }, { "name": "comment", // 列名 "type": "STRING" // データ型 } ], "source": { // ソース情報 "dbName": "yunshi_db", // データベース名 "dbType": "MySQL", // データベースタイプ "tableName": "t_shiyu_pk" // テーブル名 }, "primaryKey": [ // 主キー "id", "name" ] }, "payload": { // ペイロード "op": "INSERT", // 操作タイプ "after": { // 変更後のデータ "dataColumn": { "name": "joe", "comment": "comment", "id": 1 } }, "sequenceId": "1605339516000000004", // シーケンスID "timestamp": { // タイムスタンプ "eventTime": 1605339932000, // イベントタイム "systemTime": 1605339932736, // システムタイム "checkpointTime": 1605339932000 // チェックポイントタイム } }, "version": "0.0.1" // バージョン } - UPDATE BEFORE:
{ "schema": { // スキーマ "dataColumn": [ // データ列 { "name": "id", // 列名 "type": "LONG" // データ型 }, { "name": "name", // 列名 "type": "STRING" // データ型 }, { "name": "comment", // 列名 "type": "STRING" // データ型 } ], "source": { // ソース情報 "dbName": "yunshi_db", // データベース名 "dbType": "MySQL", // データベースタイプ "tableName": "t_shiyu_pk" // テーブル名 }, "primaryKey": [ // 主キー "id", "name" ] }, "payload": { // ペイロード "op": "UPDATE_BEFOR", // 操作タイプ "before": { // 変更前のデータ "dataColumn": { "name": "joe", "comment": "comment", "id": 1 } }, "sequenceId": "1605339516000000005", // シーケンスID "timestamp": { // タイムスタンプ "eventTime": 1605339934000, // イベントタイム "systemTime": 1605339934951, // システムタイム "checkpointTime": 1605339934000 // チェックポイントタイム } }, "version": "0.0.1" // バージョン } - UPDATE AFTER:
{ "schema": { // スキーマ "dataColumn": [ // データ列 { "name": "id", // 列名 "type": "LONG" // データ型 }, { "name": "name", // 列名 "type": "STRING" // データ型 }, { "name": "comment", // 列名 "type": "STRING" // データ型 } ], "source": { // ソース情報 "dbName": "yunshi_db", // データベース名 "dbType": "MySQL", // データベースタイプ "tableName": "t_shiyu_pk" // テーブル名 }, "primaryKey": [ // 主キー "id", "name" ] }, "payload": { // ペイロード "op": "UPDATE_AFTER", // 操作タイプ "after": { // 変更後のデータ "dataColumn": { "name": "joe", "comment": "com1", "id": 1 } }, "sequenceId": "1605339516000000005", // シーケンスID "timestamp": { // タイムスタンプ "eventTime": 1605339934000, // イベントタイム "systemTime": 1605339934951, // システムタイム "checkpointTime": 1605339934000 // チェックポイントタイム } }, "version": "0.0.1" // バージョン } - DELETE:
{ "schema": { // スキーマ "dataColumn": [ // データ列 { "name": "id", // 列名 "type": "LONG" // データ型 }, { "name": "name", // 列名 "type": "STRING" // データ型 }, { "name": "comment", // 列名 "type": "STRING" // データ型 } ], "source": { // ソース情報 "dbName": "yunshi_db", // データベース名 "dbType": "MySQL", // データベースタイプ "tableName": "t_shiyu_pk" // テーブル名 }, "primaryKey": [ // 主キー "id", "name" ] }, "payload": { // ペイロード "op": "DELETE", // 操作タイプ "before": { // 変更前のデータ "dataColumn": { "name": "joe", "comment": "com1", "id": 1 } }, "sequenceId": "1605339516000000006", // シーケンスID "timestamp": { // タイムスタンプ "eventTime": 1605339937000, // イベントタイム "systemTime": 1605339937671, // システムタイム "checkpointTime": 1605339937000 // チェックポイントタイム } }, "version": "0.0.1" // バージョン } - HEARTBEAT:
{ "schema": {}, // スキーマ "payload": { // ペイロード "op": "MHEARTBEAT", // 操作タイプ "timestamp": { // タイムスタンプ "eventTime": 1605339953629, // イベントタイム "checkpointTime": 1605339953629 // チェックポイントタイム } }, "version": "0.0.1" // バージョン } - DDL:
{ "schema": { // スキーマ "source": { // ソース情報 "dbName": "yunshi_db", // データベース名 "dbType": "MySQL", // データベースタイプ "tableName": "t_shiyu_nopk" // テーブル名 } }, "payload": { // ペイロード "op": "ALTER", // 操作タイプ "sequenceId": "1605339516000000035", // シーケンスID "ddl": { // DDL情報 "text": "alter table t_shiyu_nopk add column holo text", // DDLステートメントテキスト "ddlMeta": "rO0ABXNyACljb20uYWxpYmFiYS5kaS5wbHVnaW4uY2VudGVyLm1ldGEuRERMTWV0YQLb5Cx/YWXtAgACTAAHZGRsVGV4dHQAEkxqYXZhL2xhbmcvU3RyaW5nO0wACXN0YXRlbWVudHQAKkxjb20vYWxpYmFiYS9mYXN0c3FsL3NxbC9hc3QvU1FMU3RhdGVtZW50O3hwdAAtYWx0ZXIgdGFibGUgdF9zaGl5dV9ub3BrIGFkZCBjb2x1bW4gaG9sbyB0ZXh0c3IAPGNvbS5hbGliYWJhLmZhc3RzcWwuc3FsLmFzdC5zdGF0ZW1lbnQuU1FMQWx0ZXJUYWJsZVN0YXRlbWVudBQPP3vMUl2cAgAPSQAHYnVja2V0c1oABmlnbm9yZVoAF2ludmFsaWRhdGVHbG9iYWxJbmRleGVzWgAPbWVyZ2VTbWFsbEZpbGVzWgAHb2ZmbGluZVoABm9ubGluZVoADnJlbW92ZVBhdGl0aW5nWgATdXBkYXRlR2xvYmFsSW5kZXhlc1oAD3VwZ3JhZGVQYXRpdGluZ0wAC2NsdXN0ZXJlZEJ5dAAQTGphdmEvdXRpbC9MaXN0O0wABWl0ZW1zcQB+AAZMAAlwYXJ0aXRpb250ACxMY29tL2FsaWJhYmEvZmFzdHNxbC9zcWwvYXN0L1NRTFBhcnRpdGlvbkJ5O0wACHNvcnRlZEJ5cQB+AAZMAAx0YWJsZU9wdGlvbnNxAH4ABkwAC3RhYmxlU291cmNldAA6TGNvbS9hbGliYWJhL2Zhc3RzcWwvc3FsL2FzdC9zdGF0ZW1lbnQvU1FMRXhwclRhYmxlU291cmNlO3hyACxjb20uYWxpYmFiYS5mYXN0c3FsLnNxbC5hc3QuU1FMU3RhdGVtZW50SW1wbEOxUUDVCJMGAgADWgAJYWZ0ZXJTZW1pTAAGZGJUeXBldAAcTGNvbS9hbGliYWJhL2Zhc3RzcWwvRGJUeXBlO0wACWhlYWRIaW50c3EAfgAGeHIAKWNvbS5hbGliYWJhLmZhc3RzcWwuc3FsLmFzdC5TUUxPYmplY3RJbXBs5LvqLFggFVECAAVJAAxzb3VyY2VDb2x1bW5JAApzb3VyY2VMaW5lTAAKYXR0cmlidXRlc3QAD0xqYXZhL3V0aWwvTWFwO0wABGhpbnR0ACxMY29tL2FsaWJhYmEvZmFzdHNxbC9zcWwvYXN0L1NRTENvbW1lbnRIaW50O0wABnBhcmVudHQAJ0xjb20vYWxpYmFiYS9mYXN0c3FsL3NxbC9hc3QvU1FMT2JqZWN0O3hwAAAAAAAAAABwcHAAfnIAGmNvbS5hbGliYWJhLmZhc3RzcWwuRGJUeXBlAAAAAAAAAAASAAB4cgAOamF2YS5sYW5nLkVudW0AAAAAAAAAABIAAHhwdAAFbXlzcWxwAAAAAAAAAAAAAAAAc3IAE2phdmEudXRpbC5BcnJheUxpc3R4gdIdmcdhnQMAAUkABHNpemV4cAAAAAB3BAAAAAB4c3EAfgAUAAAAAXcEAAAAAXNyADxjb20uYWxpYmFiYS5mYXN0c3FsLnNxbC5hc3Quc3RhdGVtZW50LlNRTEFsdGVyVGFibGVBZGRDb2x1bW4l5T6CFe//BAIABloAB2Nhc2NhZGVaAAVmaXJzdEwAC2FmdGVyQ29sdW1udAAlTGNvbS9hbGliYWJhL2Zhc3RzcWwvc3FsL2FzdC9TUUxOYW1lO0wAB2NvbHVtbnNxAH4ABkwAC2ZpcnN0Q29sdW1ucQB+ABhMAAhyZXN0cmljdHQAE0xqYXZhL2xhbmcvQm9vbGVhbjt4cQB+AAsAAAAAAAAAAHBwcQB+AA8AAHBzcQB+ABQAAAABdwQAAAABc3IAOWNvbS5hbGliYWJhLmZhc3RzcWwuc3FsLmFzdC5zdGF0ZW1lbnQuU1FMQ29sdW1uRGVmaW5pdGlvbst0gLKZ0qAtAgAmWgANYXV0b0luY3JlbWVudFoADGRpc2FibGVJbmRleFoAB3ByZVNvcnRJAAxwcmVTb3J0T3JkZXJaAAZzdG9yZWRaAAd2aXJ0dWFsWgAHdmlzaWJsZUwACGFubkluZGV4dAApTGNvbS9hbGliYWJhL2Zhc3RzcWwvc3FsL2FzdC9TUUxBbm5JbmRleDtMAAZhc0V4cHJ0ACVMY29tL2FsaWJhYmEvZmFzdHNxbC9zcWwvYXN0L1NRTEV4cHI7TAALY2hhcnNV4cHJxAH4AHkwADWNvbFByb3BlcnRpZXNxAH4ABkwAC2NvbGxhdGVFeHBycQB+AB5MAAdjb21tZW50cQB+AB5MAAtjb21wcmVzc2lvbnQALkxjb20vYWxpYmFiYS9mYXN0c3FsL3NxbC9hc3QvZXhwci9TUUxDaGFyRXhwcjtMAAtjb25zdHJhaW50c3EAfgAGTAAIZGF0YVR5cGV0AClMY29tL2FsaWJhYmEvZmFzdHNxbC9zcWwvYXN0L1NRTERhdGFUeXBlO0wABmRiVHlwZXEAfgAKTAALZGVmYXVsdEV4cHJxAH4AHkwACWRlbGltaXRlcnEAfgAeTAASZGVsaW1pdGVyVG9rZW5pemVycQB+AB5MAAZlbmFibGVxAH4AGUwABmVuY29kZXEAfgAfTAAGZm9ybWF0cQB+AB5MABBnZW5lcmF0ZWRBbGF3c0FzcQB+AB5MAAhpZGVudGl0eXQARExjb20vYWxpYmFiYS9mYXN0c3FsL3NxbC9hc3Qvc3RhdGVtZW50L1NRTENvbHVtbkRlZmluaXRpb24kSWRlbnRpdHk7TAASanNvbkluZGV4QXR0cnNFeHBycQB+AB5MAAhtYXBwZWRCeXEAfgAGTAAEbmFtZXEAfgAYTAAMbmxwVG9rZW5pemVycQB+AB5MAAhvblVwZGF0ZXEAfgAeTAAEcmVseXEAfgAZTAAMc2VxdWVuY2VUeXBldAAvTGNvbS9hbGliYWJhL2Zhc3RzcWwvc3FsL2FzdC9BdXRvSW5jcmVtZW50VHlwZTtMAARzdGVwcQB+AB5MAAdzdG9yYWdlcQB+AB5MAAl1bml0Q291bnRxAH4AHkwACXVuaXRJbmRleHEAfgAeTAAIdmFsaWRhdGVxAH4AGUwACXZhbHVlVHlwZXEAfgAeeHEAfgALAAAAAAAAAABwcHEAfgAaAAAAAAAAAAAAAHBwcHBwcHBzcQB+ABQAAAAAdwQAAAAAeHNyADpjb20uYWxpYmFiYS5mYXN0c3FsLnNxbC5hc3Quc3RhdGVtZW50LlNRTENoYXJhY3RlckRhdGFUeXBlqtJac/d+04cCAAVaAAloYXNCaW5hcnlMAAtjaGFyU2V0TmFtZXEAfgABTAAIY2hhclR5cGVxAH4AAUwAB2NvbGxhdGVxAH4AAUwABWhpbnRzcQB+AAZ4cgArY29tLmFsaWJhYmEuZmFzdHNxbC5zcWwuYXN0LlNRTERhdGFUeXBlSW1wbEWL29pc1gZFAgAJSgAObmFtZUhhc2hDb2RlNjRaAAh1bnNpZ25lZFoAEXdpdGhMb2NhbFRpbWVab25lWgAIemVyb2ZpbGxMAAlhcmd1bWVudHNxAH4ABkwABmRiVHlwZXEAfgAKTAAHaW5kZXhCeXEAfgAeTAAEbmFtZXEAfgABTAAMd2l0aFRpbWVab25lcQB+ABl4cQB+AAsAAAAAAAAAAHBwcQB+ACP6BPTvGZVAfgAAAHNxAH4AFAAAAAB3BAAAAAB4cHB0AAR0ZXh0cABwcHBwcQB+ABJwcHBwcHBwcHBwc3IAMmNvbS5hbGliYWJhLmZhc3RzcWwuc3FsLmFzdC5leHByLlNRTElkZW50aWZpZXJFeHBy3DXH1zvWbgkCAARKAApoYXNoQ29kZTY0TAAEbmFtZXEAfgABTAAOcmVzb2x2ZWRDb2x1bW5xAH4ADkwAE3Jlc29sdmVkT3duZXJPYmplY3RxAH4ADnhyACdjb20uYWxpYmFiYS5mYXN0c3FsLnNxbC5hc3QuU1FMRXhwckltcGxs2ypmFJxWrQIAAHhxAH4ACwAAAAAAAAAAcHBwQCnxzH5tIDl0AARob2xvcHBwcHBwcHBwcHBweHBweHBzcQB+ABQAAAAAdwQAAAAAeHNxAH4AFAAAAAB3BAAAAAB4c3IAOGNvbS5hbGliYWJhLmZhc3RzcWwuc3FsLmFzdC5zdGF0ZW1lbnQuU1FMRXhwclRhYmxlU291cmNlRHD7eYJ4eswCAAVMAAdjb2x1bW5zcQB+AAZMAARleHBycQB+AB5MAApwYXJ0aXRpb25zcQB+AAZMAAhzYW1wbGluZ3QAOExjb20vYWxpYmFiYS9mYXN0c3FsL3NxbC9hc3Qvc3RhdGVtZW50L1NRTFRhYmxlU2FtcGxpbmc7TAAMc2NoZW1hT2JqZWN0dAAxTGNvbS9hbGliYWJhL2Zhc3RzcWwvc3FsL3JlcG9zaXRvcnkvU2NoZW1hT2JqZWN0O3hyADhjb20uYWxpYmFiYS5mYXN0c3FsLnNxbC5hc3Quc3RhdGVtZW50LlNRTFRhYmxlU291cmNlSW1wbAqEMenTm5zUAgAESgAPYWxpYXNIYXNoQ29kZTY0TAAFYWxpYXNxAH4AAUwACWZsYXNoYmFja3EAfgAeTAAFaGludHNxAH4ABnhxAH4ACwAAAAAAAAAAcHBwAAAAAAAAAABwcHBwc3EAfgAqAAAAAAAAAABwcHEAfgA0NH7o4UvP9Dt0AAx0X3NoaXl1X25vcGtwcHBwcA==" // DDLメタデータ }, "timestamp": { // タイムスタンプ "eventTime": 1605342109000, // イベントタイム "systemTime": 1605342109259, // システムタイム "checkpointTime": 1605342109000 // チェックポイントタイム } }, "version": "0.0.1" // バージョン }