Topik ini menjelaskan operasi yang didukung untuk berbagai tipe data DataHub, strategi sharding, format data, dan contoh pesan.
Operasi yang didukung untuk berbagai tipe data
Topik merupakan unit terkecil untuk berlangganan dan memublikasikan data di DataHub. Sebuah topik dapat merepresentasikan kelas atau tipe data streaming. DataHub mendukung dua jenis topik: Tuple dan Blob.
Jenis DataHub | Tulis pesan DML | Tulis pesan heartbeat upstream | Tulis pesan DDL | Pemetaan tabel sumber ke topik tujuan | Tipe data |
Tuple | Dukungan | Tidak didukung | Tidak didukung | Satu tabel ke satu topik | Tipe yang didukung DataHub |
Blob | Didukung | Didukung | Didukung | Satu database (beberapa tabel) ke satu topik | Data biner BLOB |
Untuk topik Tuple, skema bidang tidak dapat diubah setelah topik dibuat. Hal ini menjadikannya cocok untuk skenario dengan skema tetap, yaitu ketika tabel sumber tidak memiliki operasi Data Definition Language (DDL) yang mengubah skema, seperti penambahan atau penghapusan kolom. Topik Tuple tidak mendukung penyimpanan pesan DDL atau pesan heartbeat dari sumber upstream, sehingga tidak dapat meneruskan pesan tersebut ke konsumen downstream. Pemetaannya bersifat satu-ke-satu antara tabel sumber dan topik. Jika terdapat banyak tabel sumber, Anda harus membuat banyak topik, yang dapat menyulitkan konsumsi downstream.
Topik Blob tidak memiliki skema dan hanya menyimpan data biner BLOB, sehingga lebih fleksibel. Topik ini mendukung penyimpanan pesan DDL dan pesan heartbeat dari sumber, yang dapat diteruskan ke konsumen downstream. Pemetaannya adalah satu database (berisi beberapa tabel) ke satu topik. Anda hanya perlu membuat satu topik, terlepas dari jumlah tabel sumber, sehingga menyederhanakan konsumsi downstream. Oleh karena itu, topik Blob lebih cocok untuk skenario di mana DataHub digunakan sebagai antrian pesan perantara dalam migrasi database penuh.
Strategi sharding untuk berbagai tipe data
Shard merupakan saluran konkuren untuk transmisi data ke topik DataHub. Setiap shard memiliki batas kecepatan penulisan maksimum. Penggunaan beberapa shard dapat meningkatkan performa penulisan. Namun, DataHub hanya menjamin urutan pesan dalam satu shard, bukan antar shard. Untuk meningkatkan performa penulisan dengan menambah jumlah shard sekaligus memastikan urutan pesan dan menghindari kesenjangan data, strategi sharding berikut disediakan untuk topik Blob dan Tuple.
Skenario | Tuple | Blob |
Dengan primary key (termasuk primary key kustom) | Shard berdasarkan primary key | Shard berdasarkan primary key |
Jaminan Pesanan | Pesan dengan primary key yang sama diurutkan | Pesan dengan primary key yang sama diurutkan |
Tanpa primary key | Sharding acak | Shard berdasarkan nama tabel |
Jaminan Pesanan | Urutan tidak dijamin | Pesan untuk tabel yang sama diurutkan |
Format data sinkronisasi
Tuple
Format data menggunakan tipe data yang didukung oleh topik Tuple DataHub. Saat Anda membuat topik di Data Integration, kolom metadata tertentu ditambahkan secara otomatis.
Kolom metadata tersebut adalah
_sequence_id_,_execute_time_,_source_table_,_before_image_, dan_after_image_.Parameter
Deskripsi
_sequence_id_
String. ID numerik unik untuk setiap pesan. Operasi update before dan update after memiliki sequence ID yang sama.
_excute_time_
Waktu saat data dihasilkan.
_source_table_
Nama tabel sumber.
_before_image_
Before image. Y untuk operasi update before dan delete. N untuk operasi update after dan insert.
_after_image_
After image. N untuk operasi update before dan delete. Y untuk operasi update after dan insert.
Contoh: Tabel berikut menunjukkan hasil sinkronisasi pernyataan Insert, Update, dan Delete ke DataHub.
_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
Blob
Format pesan untuk topik Blob adalah data biner yang dikonversi dari string JSON. Format JSON yang sesuai adalah sebagai berikut:
{ "schema": { // Informasi metadata untuk perubahan, hanya menentukan nama dan tipe kolom "dataColumn": [// Informasi tentang kolom data yang berubah, digunakan untuk memperbarui catatan di tabel tujuan { "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, // String. Digunakan untuk mengurutkan data saat menggabungkan data inkremental dan penuh. "op": "INSERT/UPDATE/DELETE/TRANSACTION_BEGIN/TRANSACTION_END/CREATE/ALTER/ERASE/QUERY/TRUNCATE/RENAME/CINDEX/DINDEX/GTID/XACOMMIT/XAROLLBACK/MHEARTBEAT...", // Case-sensitive "timestamp": { "eventTime": 1, // Wajib. Waktu perubahan catatan. Timestamp 13 digit dengan presisi milidetik. "systemTime": 2, // Opsional. Ada untuk beberapa sumber data, seperti Oracle CDC. "checkpointTime": 3 // Opsional. Disertakan oleh beberapa sumber data, seperti OceanBase Database. }, "ddl": { "text": "ADD COLUMN ...", "ddlMeta": "[SQLStatement serialized binary, expressed in base64 string]" } }, "version":"1.0.0" }Deskripsi bidang Blob
PentingSemua tipe bidang dalam pesan harus merupakan salah satu dari enam tipe yang ditentukan oleh StreamX: BOOLEAN, DOUBLE, DATE, BYTES, LONG, atau STRING.
BOOLEAN: Nilainya true atau false. DATE: Nilainya integer 13 digit yang merepresentasikan timestamp dengan presisi milidetik. BYTES: Menyimpan tipe bytes. Formatnya adalah string yang di-encode Base64. Encode dan decode Base64 diimplementasikan menggunakan antarmuka di java.util.Base64: String text = "test_text123"; // Encode Base64.getEncoder().encodeToString(text.getBytes("UTF-8")) // Decode Base64.getDecoder().decode(encodedText)Elemen tingkat pertama
Elemen tingkat kedua
Deskripsi
schema
dataColumn
JSONArray. Informasi tentang tipe kolom data. dataColumn mencatat semua kolom dan informasi tipe yang sesuai untuk perubahan data upstream. Operasi perubahan mencakup modifikasi data (insert, delete, dan update) serta perubahan skema tabel di database.
Name: Nama kolom
type: Tipe kolom.
primaryKey
List. Informasi tentang primary key.
pk: Nama primary key.
source
Object. Informasi tentang database atau tabel sumber.
dbType: String. Tipe database.
dbVersion: String. Versi database.
dbName: String. Nama database.
schemaName: String. Nama skema (untuk database seperti PostgreSQL dan SQL Server).
tableName: String. Nama tabel.
payload
before
JSONObject. Data sebelum modifikasi. Misalnya, jika operasi update dilakukan pada catatan di sumber data MySQL, bidang before menyimpan konten catatan sebelum update.
Bidang ini diisi dalam catatan yang ditulis ketika pesan operasi update atau delete dibaca dari sumber.
dataColumn: JSONObject. Informasi data. Formatnya adalah column_name: column_value. Nama kolom berupa string. Nilai kolom tergantung pada tipenya. Tipe BYTES direpresentasikan sebagai string Base64. Tipe DATE adalah timestamp 13 digit yang direpresentasikan sebagai integer panjang. Tipe lain menggunakan tipe nilai mereka sendiri.
after
Data setelah modifikasi. Formatnya sama dengan before.
CatatanWajib untuk operasi update dan insert.
op
Tipe operasi. Nilai yang valid:
INSERT: Penyisipan data.
UPDATE_BEFOR: Sebelum pembaruan data.
UPDATE_AFTER: Setelah pembaruan data.
DELETE: Penghapusan data.
TRANSACTION_BEGIN: Awal transaksi database.
TRANSACTION_END: Akhir transaksi database.
CREATE: Pembuatan tabel di database.
ALTER: Perubahan tabel di database.
QUERY: SQL asli untuk perubahan database.
TRUNCATE: Pemangkasan tabel di database.
RENAME: Penggantian nama tabel di database.
CINDEX: Pembuatan indeks.
DINDEX: Penghapusan indeks.
MHEARTBEAT: Pesan heartbeat yang menunjukkan sinkronisasi berjalan normal saat tidak ada data baru dari sumber.
timestamp
JSONObject. Timestamp yang terkait dengan catatan data ini.
eventTime: Long. Waktu perubahan terjadi di database sumber. Timestamp 13 digit dengan presisi milidetik.
systemTime: Long. Waktu saat tugas sinkronisasi memproses pesan perubahan ini. Timestamp 13 digit dengan presisi milidetik.
checkpointTime: Long. Waktu yang ditetapkan saat mengatur ulang offset sinkronisasi. Timestamp 13 digit dengan presisi milidetik, biasanya sama dengan eventTime.
ddl
Bidang ini diisi hanya ketika skema tabel database diubah. Untuk perubahan data (termasuk insert, delete, dan update), bidang ddl diatur ke null.
text: String. Teks pernyataan DDL database.
ddlMeta: String. Representasi biner objek SQLStatement, yang dihasilkan dengan mengurai pernyataan DDL menggunakan FastSQL. Representasi biner ini diserialisasi lalu disimpan sebagai string yang di-encode Base64.
Saat dukungan DDL diaktifkan, objek SQLStatement yang diserialisasi harus diteruskan. Tautan downstream melakukan deserialisasi dan penguraian objek untuk mengembalikannya menjadi pernyataan DDL agar sumber data tujuan dapat melakukan perubahan.
version
None
Nomor versi format.
Deskripsi serialisasi Blob
Dalam format JSON yang dijelaskan dalam topik ini, satu pesan berkorespondensi dengan satu JSONObject. Konten dalam JSONObject dipetakan level demi level ke format yang sesuai, seperti JSONObject, JSONArray, atau nilai tipe tertentu, sesuai dengan format pesan.
Tipe penyimpanan setiap bidang dalam JSONObject mengikuti deskripsi bidang yang telah disebutkan sebelumnya. Untuk serialisasi, JSONObject dikonversi menjadi string (misalnya, menggunakan metode toJSONString dari fastJSON), lalu string tersebut dikonversi menjadi array byte dengan set karakter UTF-8 melalui metode getBytes(Charsets.UTF_8).
Contoh JSON untuk pesan terkait
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", "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", "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", "timestamp": { "eventTime": 1605339934000, "systemTime": 1605339934951, "checkpointTime": 1605339934000 } }, "version": "0.0.1" }Hapus:
{ "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", "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": "test_db", "dbType": "MySQL", "tableName": "t_test_nopk" } }, "payload": { "op": "ALTER", "sequenceId": "1605339516000000035", "ddl": { "text": "alter table t_test_nopk add column holo text", "ddlMeta": "rO0ABXNyACljb20uYWxpYmFiYS5kaS5wbHVnaW4uY2VudGVyLm1ldGEuRERMTWV0YQLb5Cx/YWXtAgACTAAHZGRsVGV4dHQAEkxqYXZhL2xhbmcvU3RyaW5nO0wACXN0YXRlbWVudHQAKkxjb20vYWxpYmFiYS9mYXN0c3FsL3NxbC9hc3QvU1FMU3RhdGVtZW50O3hwdAAtYWx0ZXIgdGFibGUgdF9zaGl5dV9ub3BrIGFkZCBjb2x1bW4gaG9sbyB0ZXh0c3IAPGNvbS5hbGliYWJhLmZhc3RzcWwuc3FsLmFzdC5zdGF0ZW1lbnQuU1FMQWx0ZXJUYWJsZVN0YXRlbWVudBQPP3vMUl2cAgAPSQAHYnVja2V0c1oABmlnbm9yZVoAF2ludmFsaWRhdGVHbG9iYWxJbmRleGVzWgAPbWVyZ2VTbWFsbEZpbGVzWgAHb2ZmbGluZVoABm9ubGluZVoADnJlbW92ZVBhdGl0aW5nWgATdXBkYXRlR2xvYmFsSW5kZXhlc1oAD3VwZ3JhZGVQYXRpdGluZ0wAC2NsdXN0ZXJlZEJ5dAAQTGphdmEvdXRpbC9MaXN0O0wABWl0ZW1zcQB+AAZMAAlwYXJ0aXRpb250ACxMY29tL2FsaWJhYmEvZmFzdHNxbC9zcWwvYXN0L1NRTFBhcnRpdGlvbkJ5O0wACHNvcnRlZEJ5cQB+AAZMAAx0YWJsZU9wdGlvbnNxAH4ABkwAC3RhYmxlU291cmNldAA6TGNvbS9hbGliYWJhL2Zhc3RzcWwvc3FsL2FzdC9zdGF0ZW1lbnQvU1FMRXhwclRhYmxlU291cmNlO3hyACxjb20uYWxpYmFiYS5mYXN0c3FsLnNxbC5hc3QuU1FMU3RhdGVtZW50SW1wbEOxUUDVCJMGAgADWgAJYWZ0ZXJTZW1pTAAGZGJUeXBldAAcTGNvbS9hbGliYWJhL2Zhc3RzcWwvRGJUeXBlO0wACWhlYWRIaW50c3EAfgAGeHIAKWNvbS5hbGliYWJhLmZhc3RzcWwuc3FsLmFzdC5TUUxPYmplY3RJbXBs5LvqLFggFVECAAVJAAxzb3VyY2VDb2x1bW5JAApzb3VyY2VMaW5lTAAKYXR0cmlidXRlc3QAD0xqYXZhL3V0aWwvTWFwO0wABGhpbnR0ACxMY29tL2FsaWJhYmEvZmFzdHNxbC9zcWwvYXN0L1NRTENvbW1lbnRIaW50O0wABnBhcmVudHQAJ0xjb20vYWxpYmFiYS9mYXN0c3FsL3NxbC9hc3QvU1FMT2JqZWN0O3hwAAAAAAAAAABwcHAAfnIAGmNvbS5hbGliYWJhLmZhc3RzcWwuRGJUeXBlAAAAAAAAAAASAAB4cgAOamF2YS5sYW5nLkVudW0AAAAAAAAAABIAAHhwdAAFbXlzcWxwAAAAAAAAAAAAAAAAc3IAE2phdmEudXRpbC5BcnJheUxpc3R4gdIdmcdhnQMAAUkABHNpemV4cAAAAAB3BAAAAAB4c3EAfgAUAAAAAXcEAAAAAXNyADxjb20uYWxpYmFiYS5mYXN0c3FsLnNxbC5hc3Quc3RhdGVtZW50LlNRTEFsdGVyVGFibGVBZGRDb2x1bW4l5T6CFe//BAIABloAB2Nhc2NhZGVaAAVmaXJzdEwAC2FmdGVyQ29sdW1udAAlTGNvbS9hbGliYWJhL2Zhc3RzcWwvc3FsL2FzdC9TUUxOYW1lO0wAB2NvbHVtbnNxAH4ABkwAC2ZpcnN0Q29sdW1ucQB+ABhMAAhyZXN0cmljdHQAE0xqYXZhL2xhbmcvQm9vbGVhbjt4cQB+AAsAAAAAAAAAAHBwcQB+AA8AAHBzcQB+ABQAAAABdwQAAAABc3IAOWNvbS5hbGliYWJhLmZhc3RzcWwuc3FsLmFzdC5zdGF0ZW1lbnQuU1FMQ29sdW1uRGVmaW5pdGlvbst0gLKZ0qAtAgAmWgANYXV0b0luY3JlbWVudFoADGRpc2FibGVJbmRleFoAB3ByZVNvcnRJAAxwcmVTb3J0T3JkZXJaAAZzdG9yZWRaAAd2aXJ0dWFsWgAHdmlzaWJsZUwACGFubmluZGV4dAApTGNvbS9hbGliYWJhL2Zhc3RzcWwvc3FsL2FzdC9TUUxBbm5JbmRleDtMAAZhc0V4cHJ0ACVMY29tL2FsaWJhYmEvZmFzdHNxbC9zcWwvYXN0L1NRTEV4cHI7TAALY2hhcnNldEV4cHJxAH4AHkwADWNvbFByb3BlcnRpZXNxAH4ABkwAC2NvbGxhdGVFeHBycQB+AB5MAAdjb21tZW50cQB+AB5MAAtjb21wcmVzc2lvbnQALkxjb20vYWxpYmFiYS9mYXN0c3FsL3NxbC9hc3QvZXhwci9TUUxDaGFyRXhwcjtMAAtjb25zdHJhaW50c3EAfgAGTAAIZGF0YVR5cGV0AClMY29tL2FsaWJhYmEvZmFzdHNxbC9zcWwvYXN0L1NRTERhdGFUeXBlO0wABmRiVHlwZXEAfgAKTAALZGVmYXVsdEV4cHJxAH4AHkwACWRlbGltaXRlcnEAfgAeTAASZGVsaW1pdGVyVG9rZW5pemVycQB+AB5MAAZlbmFibGVxAH4AGUwABmVuY29kZXEAfgAfTAAGZm9ybWF0cQB+AB5MABBnZW5lcmF0ZWRBbGF3c0FzcQB+AB5MAAhpZGVudGl0eXQARExjb20vYWxpYmFiYS9mYXN0c3FsL3NxbC9hc3Qvc3RhdGVtZW50L1NRTENvbHVtbkRlZmluaXRpb24kSWRlbnRpdHk7TAASanNvbkluZGV4QXR0cnNFeHBycQB+AB5MAAhtYXBwZWRCeXEAfgAGTAAEbmFtZXEAfgAYTAAMbmxwVG9rZW5pemVycQB+AB5MAAhvblVwZGF0ZXEAfgAeTAAEcmVseXEAfgAZTAAMc2VxdWVuY2VUeXBldAAvTGNvbS9hbGliYWJhL2Zhc3RzcWwvc3FsL2FzdC9BdXRvSW5jcmVtZW50VHlwZTtMAARzdGVwcQB+AB5MAAdzdG9yYWdlcQB+AB5MAAl1bml0Q291bnRxAH4AHkwACXVuaXRJbmRleHEAfgAeTAAIdmFsaWRhdGVxAH4AGUwACXZhbHVlVHlwZXEAfgAeeHEAfgALAAAAAAAAAABwcHEAfgAaAAAAAAAAAAAAAHBwcHBwcHBzcQB+ABQAAAAAdwQAAAAAeHNyADpjb20uYWxpYmFiYS5mYXN0c3FsLnNxbC5hc3Quc3RhdGVtZW50LlNRTENoYXJhY3RlckRhdGFUeXBlqtJac/d+04cCAAVaAAloYXNCaW5hcnlMAAtjaGFyU2V0TmFtZXEAfgABTAAIY2hhclR5cGVxAH4AAUwAB2NvbGxhdGVxAH4AAUwABWhpbnRzcQB+AAZ4cgArY29tLmFsaWJhYmEuZmFzdHNxbC5zcWwuYXN0LlNRTERhdGFUeXBlSW1wbEWL29pc1gZFAgAJSgAObmFtZUhhc2hDb2RlNjRaAAh1bnNpZ25lZFoAEXdpdGhMb2NhbFRpbWVab25lWgAIemVyb2ZpbGxMAAlhcmd1bWVudHNxAH4ABkwABmRiVHlwZXEAfgAKTAAHaW5kZXhCeXEAfgAeTAAEbmFtZXEAfgABTAAMd2l0aFRpbWVab25lcQB+ABl4cQB+AAsAAAAAAAAAAHBwcQB+ACP6BPTvGZVAfgAAAHNxAH4AFAAAAAB3BAAAAAB4cHB0AAR0ZXh0cABwcHBwcQB+ABJwcHBwcHBwcHBwc3IAMmNvbS5hbGliYWJhLmZhc3RzcWwuc3FsLmFzdC5leHByLlNRTElkZW50aWZpZXJFeHBy3DXH1zvWbgkCAARKAApoYXNoQ29kZTY0TAAEbmFtZXEAfgABTAAOcmVzb2x2ZWRDb2x1bW5xAH4ADkwAE3Jlc29sdmVkT3duZXJPYmplY3RxAH4ADnhyACdjb20uYWxpYmFiYS5mYXN0c3FsLnNxbC5hc3QuU1FMRXhwckltcGxs2ypmFJxWrQIAAHhxAH4ACwAAAAAAAAAAcHBwQCnxzH5tIDl0AARob2xvcHBwcHBwcHBwcHBweHBweHBzcQB+ABQAAAAAdwQAAAAAeHNxAH4AFAAAAAB3BAAAAAB4c3IAOGNvbS5hbGliYWJhLmZhc3RzcWwuc3FsLmFzdC5zdGF0ZW1lbnQuU1FMRXhwclRhYmxlU291cmNlRHD7eYJ4eswCAAVMAAdjb2x1bW5zcQB+AAZMAARleHBycQB+AB5MAApwYXJ0aXRpb25zcQB+AAZMAAhzYW1wbGluZ3QAOExjb20vYWxpYmFiYS9mYXN0c3FsL3NxbC9hc3Qvc3RhdGVtZW50L1NRTFRhYmxlU2FtcGxpbmc7TAAMc2NoZW1hT2JqZWN0dAAxTGNvbS9hbGliYWJhL2Zhc3RzcWwvc3FsL3JlcG9zaXRvcnkvU2NoZW1hT2JqZWN0O3hyADhjb20uYWxpYmFiYS5mYXN0c3FsLnNxbC5hc3Quc3RhdGVtZW50LlNRTFRhYmxlU291cmNlSW1wbAqEMenTm5zUAgAESgAPYWxpYXNIYXNoQ29kZTY0TAAFYWxpYXNxAH4AAUwACWZsYXNoYmFja3EAfgAeTAAFaGludHNxAH4ABnhxAH4ACwAAAAAAAAAAcHBwAAAAAAAAAABwcHBwc3EAfgAqAAAAAAAAAABwcHEAfgA0NH7o4UvP9Dt0AAx0X3NoaXl1X25vcGtwcHBwcA==" }, "timestamp": { "eventTime": 1605342109000, "systemTime": 1605342109259, "checkpointTime": 1605342109000 } }, "version": "0.0.1" }