Topik ini menjelaskan struktur dan bidang pesan yang ditulis ke Kafka.
Informasi latar belakang
Saat Anda menyinkronkan seluruh database ke Kafka, tugas sinkronisasi membaca data dari sumber data hulu dan menuliskannya ke topik Kafka dalam format JSON yang dijelaskan dalam topik ini. Format pesan secara keseluruhan mencakup informasi kolom untuk catatan perubahan serta status data sebelum dan sesudah perubahan. Untuk memungkinkan konsumen melacak progres tugas, tugas sinkronisasi juga secara berkala mengirim catatan heartbeat ke topik Kafka. Catatan heartbeat ini memiliki bidang op dengan nilai MHEARTBEAT. Topik ini menjelaskan format pesan secara keseluruhan, format pesan heartbeat, dan format pesan untuk perubahan data sumber. Untuk informasi lebih lanjut, lihat Tipe bidang dan Parameter.
Format pesan untuk output single-table real-time
Saat Anda mengonfigurasi destinasi Kafka untuk tugas sinkronisasi single-table real-time, Anda harus menentukan format nilai untuk catatan yang ditulis ke Kafka. Format yang didukung mencakup Canal CDC dan JSON. Untuk detail lebih lanjut, lihat Lampiran: Deskripsi format output.
Tipe bidang
Sistem membaca data dari sumber, memetakannya ke salah satu dari enam tipe (BOOLEAN, DOUBLE, DATE, BYTES, LONG, atau STRING), dan menuliskannya ke topik Kafka dalam format JSON.
|
Tipe |
Deskripsi |
|
BOOLEAN |
Bersesuaian dengan tipe boolean JSON. Nilai yang valid adalah |
|
DATE |
Bersesuaian dengan tipe angka JSON. Nilainya berupa timestamp Unix 13 digit dengan presisi milidetik (ms). |
|
BYTES |
Bersesuaian dengan tipe string dalam JSON. Sebelum ditulis ke Kafka, array byte dikodekan Base64 menjadi string. Saat dikonsumsi, data tersebut harus didekode Base64 (Encoding: Base64.getEncoder().encodeToString(text.getBytes("UTF-8")). Decoding: Base64.getDecoder().decode(encodedText)). |
|
STRING |
Bersesuaian dengan tipe string JSON. |
|
LONG |
Bersesuaian dengan tipe angka JSON. |
|
DOUBLE |
Bersesuaian dengan tipe angka JSON. |
Parameter
Tabel berikut menjelaskan setiap bidang dalam pesan yang ditulis ke Kafka.
|
Bidang level-1 |
Bidang level-2 |
Deskripsi |
|
schema |
dataColumn |
Tipe datanya adalah JSONArray. Parameter dataColumn mencatat informasi tipe untuk semua kolom dari catatan perubahan data hulu. Operasi perubahan mencakup perubahan data di database, seperti penambahan, penghapusan, dan pembaruan, serta perubahan pada skema tabel database.
|
|
primaryKey |
Daftar nama kolom kunci primer. |
|
|
source |
Objek yang berisi informasi tentang database atau tabel sumber.
|
|
|
payload |
before |
JSONObject yang merepresentasikan catatan data sebelum perubahan, juga dikenal sebagai "before image". Misalnya, jika catatan di sumber data MySQL diperbarui, bidang
|
|
after |
Data setelah perubahan, juga dikenal sebagai "after image". Formatnya sama dengan bidang |
|
|
sequenceId |
String unik yang dihasilkan oleh StreamX untuk setiap catatan. Digunakan untuk mengurutkan data saat menggabungkan data penuh dan data inkremental. Catatan
Operasi pembaruan dari sumber menghasilkan dua catatan: catatan "update before" dan catatan "update after". Kedua catatan tersebut memiliki |
|
|
scn |
System Change Number (SCN) dari sumber. Bidang ini hanya berlaku untuk sumber Oracle. |
|
|
op |
Jenis operasi yang ditangkap dari sumber. Nilai yang valid:
|
|
|
timestamp |
JSONObject yang berisi timestamp terkait catatan data.
|
|
|
ddl |
Bidang ini diisi dengan data hanya ketika skema tabel database diubah. Untuk perubahan data, seperti penambahan, penghapusan, dan modifikasi, ddl yang bersesuaian langsung diatur ke null.
|
|
|
version |
N/A |
Versi format pesan. |
Format pesan secara keseluruhan
Kode berikut menunjukkan format umum pesan Kafka:
{
"schema": { // Metadata tentang perubahan, termasuk nama dan tipe kolom.
"dataColumn": [// Informasi tentang kolom data yang berubah, digunakan untuk memperbarui catatan di destinasi.
{
"name": "id",
"type": "LONG"
},
{
"name": "name",
"type": "STRING"
},
{
"name": "binData",
"type": "BYTES"
},
{
"name": "ts",
"type": "DATE"
},
{
"name":"rowid",// Jika sumber data adalah Oracle, rowid disertakan dalam kolom data.
"type":"STRING"
}
],
"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,
"rowid": "AAIUMPAAFAACxExAAE"// Tipe string. Rowid dari sumber Oracle.
}
},
"after": {
"dataColumn":{
"id": 222,
"name":"donald",
"binData": "[base64 string]",
"ts": 1590315269000,
"rowid": "AAIUMPAAFAACxExAAE"// Tipe string. Rowid dari sumber Oracle.
}
},
"sequenceId":"XXX",// Tipe string. Digunakan untuk mengurutkan data saat menggabungkan data penuh dan inkremental.
"scn":"xxxx",// Tipe string. System Change Number (SCN) dari sumber Oracle.
"op": "INSERT/UPDATE_BEFOR/UPDATE_AFTER/DELETE/TRANSACTION_BEGIN/TRANSACTION_END/CREATE/ALTER/ERASE/QUERY/TRUNCATE/RENAME/CINDEX/DINDEX/GTID/XACOMMIT/XAROLLBACK/MHEARTBEAT...",// Nilainya case-sensitive.
"timestamp": {
"eventTime": 1,// Wajib. Waktu event perubahan di database sumber. Timestamp 13 digit dengan presisi milidetik.
"systemTime": 2,// Opsional. Waktu saat tugas sinkronisasi memproses pesan perubahan ini. Timestamp 13 digit dengan presisi milidetik.
"checkpointTime": 3// Opsional. Timestamp yang digunakan saat mengatur ulang offset sinkronisasi. Biasanya sama dengan eventTime.
},
"ddl": {
"text": "ADD COLUMN ...",
"ddlMeta": "[String Base64-encoded dari objek SQLStatement yang diserialisasi]"
}
},
"version":"1.0.0"
}
Untuk informasi lebih lanjut tentang tipe bidang dan parameter, lihat Tipe bidang dan Parameter.
Format pesan heartbeat
{
"schema": {
"dataColumn": null,
"primaryKey": null,
"source": null
},
"payload": {
"before": null,
"after": null,
"sequenceId": null,
"timestamp": {
"eventTime": 1620457659000,
"checkpointTime": 1620457659000
},
"op": "MHEARTBEAT",
"ddl": null
},
"version": "0.0.1"
}
Untuk informasi lebih lanjut tentang tipe bidang dan parameter, lihat Tipe bidang dan Parameter.
Format pesan untuk perubahan data sumber
-
Format pesan untuk operasi insert:
{ "schema": { "dataColumn": [ { "name": "name", "type": "STRING" }, { "name": "job", "type": "STRING" }, { "name": "sex", "type": "STRING" }, { "name": "#alibaba_rds_row_id#", "type": "LONG" } ], "primaryKey": null, "source": { "dbType": "MySQL", "dbName": "pkset_test", "tableName": "pkset_test_no_pk" } }, "payload": { "before": null, "after": { "dataColumn": { "name": "name11", "job": "job11", "sex": "man", "#alibaba_rds_row_id#": 15 } }, "sequenceId": "1620457642589000000", "timestamp": { "eventTime": 1620457896000, "systemTime": 1620457896977, "checkpointTime": 1620457896000 }, "op": "INSERT", "ddl": null }, "version": "0.0.1" } -
Format pesan untuk operasi update:
-
Jika opsi "When one record in the source is updated, one Kafka record is generated." tidak dipilih, operasi update menghasilkan dua pesan Kafka: satu untuk status data sebelum update ("before image") dan satu untuk status setelah update ("after image"). Contoh kode berikut menunjukkan formatnya:
Format pesan untuk before image:
{ "schema": { "dataColumn": [ { "name": "name", "type": "STRING" }, { "name": "job", "type": "STRING" }, { "name": "sex", "type": "STRING" }, { "name": "#alibaba_rds_row_id#", "type": "LONG" } ], "primaryKey": null, "source": { "dbType": "MySQL", "dbName": "pkset_test", "tableName": "pkset_test_no_pk" } }, "payload": { "before": { "dataColumn": { "name": "name11", "job": "job11", "sex": "man", "#alibaba_rds_row_id#": 15 } }, "after": null, "sequenceId": "1620457642589000001", "timestamp": { "eventTime": 1620458077000, "systemTime": 1620458077779, "checkpointTime": 1620458077000 }, "op": "UPDATE_BEFOR", "ddl": null }, "version": "0.0.1" }Format pesan untuk after image:
{ "schema": { "dataColumn": [ { "name": "name", "type": "STRING" }, { "name": "job", "type": "STRING" }, { "name": "sex", "type": "STRING" }, { "name": "#alibaba_rds_row_id#", "type": "LONG" } ], "primaryKey": null, "source": { "dbType": "MySQL", "dbName": "pkset_test", "tableName": "pkset_test_no_pk" } }, "payload": { "before": null, "after": { "dataColumn": { "name": "name11", "job": "job11", "sex": "woman", "#alibaba_rds_row_id#": 15 } }, "sequenceId": "1620457642589000001", "timestamp": { "eventTime": 1620458077000, "systemTime": 1620458077779, "checkpointTime": 1620458077000 }, "op": "UPDATE_AFTER", "ddl": null }, "version": "0.0.1" } -
Jika opsi "When one record in the source is updated, one Kafka record is generated." dipilih, operasi update menghasilkan satu pesan Kafka yang berisi both before dan after image data. Contoh kode berikut menunjukkan formatnya:
{ "schema": { "dataColumn": [ { "name": "name", "type": "STRING" }, { "name": "job", "type": "STRING" }, { "name": "sex", "type": "STRING" }, { "name": "#alibaba_rds_row_id#", "type": "LONG" } ], "primaryKey": null, "source": { "dbType": "MySQL", "dbName": "pkset_test", "tableName": "pkset_test_no_pk" } }, "payload": { "before": { "dataColumn": { "name": "name11", "job": "job11", "sex": "man", "#alibaba_rds_row_id#": 15 } }, "after": { "dataColumn": { "name": "name11", "job": "job11", "sex": "woman", "#alibaba_rds_row_id#": 15 } }, "sequenceId": "1620457642589000001", "timestamp": { "eventTime": 1620458077000, "systemTime": 1620458077779, "checkpointTime": 1620458077000 }, "op": "UPDATE_AFTER", "ddl": null }, "version": "0.0.1" }
-
-
Format pesan untuk operasi delete:
{ "schema": { "dataColumn": [ { "name": "name", "type": "STRING" }, { "name": "job", "type": "STRING" }, { "name": "sex", "type": "STRING" }, { "name": "#alibaba_rds_row_id#", "type": "LONG" } ], "primaryKey": null, "source": { "dbType": "MySQL", "dbName": "pkset_test", "tableName": "pkset_test_no_pk" } }, "payload": { "before": { "dataColumn": { "name": "name11", "job": "job11", "sex": "woman", "#alibaba_rds_row_id#": 15 } }, "after": null, "sequenceId": "1620457642589000002", "timestamp": { "eventTime": 1620458266000, "systemTime": 1620458266101, "checkpointTime": 1620458266000 }, "op": "DELETE", "ddl": null }, "version": "0.0.1" }
Untuk informasi lebih lanjut tentang tipe bidang dan parameter, lihat Tipe bidang dan Parameter.