Este tema describe la estructura de los mensajes que se escriben en Kafka y el significado de cada campo.
Contexto
Una tarea de sincronización de base de datos completa lee los datos de un origen y los escribe en un topic de Kafka con el formato JSON que se describe a continuación. Cada mensaje contiene la información de las columnas del registro de cambio, así como el estado de los datos antes y después de la modificación. Para que los consumidores de Kafka determinen el avance de la tarea, esta también escribe periódicamente un registro de latido en el topic, donde el campo op se establece en MHEARTBEAT. En las siguientes secciones se describen Overall message format, Synchronization task heartbeat message format y Message format for source data changes. Para conocer los tipos de campo y la descripción de cada parámetro, consulte Field types y Parameter descriptions.
Formato del mensaje de salida en tiempo real para una sola tabla
Single-table real-time tasks Al configurar un destino de Kafka, especifique el formato del campo Value en los registros de Kafka. Los formatos compatibles son Canal CDC y JSON. Para más detalles, consulte Appendix: Description of output formats.
Tipos de campo
Los datos leídos del origen se asignan a uno de estos seis tipos (BOOLEAN, DOUBLE, DATE, BYTES, LONG y STRING) antes de escribirse en un topic de Kafka con el formato JSON correspondiente.
|
Tipo |
Descripción |
|
BOOLEAN |
Se asigna al tipo booleano de JSON; sus valores son true y false. |
|
DATE |
Se asigna al tipo numérico de JSON; es una marca de tiempo de 13 dígitos con precisión de milisegundos. |
|
BYTES |
Se asigna al tipo cadena de JSON. Las matrices de bytes se codifican en Base64 antes de escribirse en Kafka. Los consumidores deben decodificarlas con Base64 (codificación: Base64.getEncoder().encodeToString(text.getBytes("UTF-8")); decodificación: Base64.getDecoder().decode(encodedText)). |
|
STRING |
Se asigna al tipo cadena de JSON. |
|
LONG |
Se asigna al tipo numérico de JSON. |
|
DOUBLE |
Se asigna al tipo numérico de JSON. |
Descripción de parámetros
En la siguiente tabla se describen los campos de los mensajes que se escriben en Kafka.
|
Elemento de nivel superior |
Elemento de segundo nivel |
Descripción |
|
schema |
dataColumn |
JSONArray que contiene la información de los tipos de columna de datos.dataColumnRegistra todas las columnas y sus tipos en los registros de cambio del origen. Estos cambios incluyen inserciones, eliminaciones o actualizaciones de datos, así como modificaciones en el esquema de las tablas de la base de datos.
|
|
primaryKey |
Lista que contiene la información de la clave primaria. pk: nombre de la clave primaria. |
|
|
source |
Objeto que contiene la información de la base de datos o tabla de origen.
|
|
|
payload |
before |
JSONObject que contiene los datos previos a una actualización. Por ejemplo, si un origen MySQL actualiza un registro, before almacena los datos de ese registro antes de la modificación.
|
|
after |
Datos posteriores a la actualización, con el mismo formato que before. |
|
|
sequenceId |
Cadena generada por Streamx para ordenar los datos incrementales y completos durante una fusión. Cada registro de Streamx tiene un sequenceId único. Nota
Un mensaje de actualización leído del origen genera dos registros de salida (update before y update after) con el mismo sequenceId. |
|
|
scn |
Válido cuando el origen es Oracle; contiene el SCN de Oracle. |
|
|
op |
El tipo de mensaje leído del origen. Valores válidos:
|
|
|
timestamp |
JSONObject que contiene las marcas de tiempo relacionadas con este registro.
|
|
|
ddl |
Este campo solo se llena cuando cambia el esquema de una tabla de la base de datos. Para los cambios de datos (inserciones, eliminaciones y actualizaciones), el campo ddl se establece en null.
|
|
|
version |
Ninguna |
Versión del formato de mensaje. |
Formato general del mensaje
El formato general de un mensaje escrito en Kafka es el siguiente:
{ "schema": { //Metadatos del cambio; solo contiene nombres y tipos de columna "dataColumn": [//Información de las columnas de datos modificadas para actualizar el registro de la tabla de destino { "name": "id", "type": "LONG" }, { "name": "name", "type": "STRING" }, { "name": "binData", "type": "BYTES" }, { "name": "ts", "type": "DATE" }, { "name":"rowid",// Si el origen es Oracle, rowid se incluye entre las columnas de datos "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"//Cadena que contiene el rowid de Oracle } }, "after": { "dataColumn":{ "id": 222, "name":"donald", "binData": "[base64 string]", "ts": 1590315269000, "rowid": "AAIUMPAAFAACxExAAE"//Cadena que contiene el rowid de Oracle } }, "sequenceId":"XXX",//Cadena utilizada para ordenar los datos al fusionar información incremental y completa, "scn":"xxxx",//Cadena que contiene el SCN de Oracle "op": "INSERT/UPDATE_BEFOR/UPDATE_AFTER/DELETE/TRANSACTION_BEGIN/TRANSACTION_END/CREATE/ALTER/ERASE/QUERY/TRUNCATE/RENAME/CINDEX/DINDEX/GTID/XACOMMIT/XAROLLBACK/MHEARTBEAT...",//Distingue entre mayúsculas y minúsculas, "timestamp": { "eventTime": 1,//Obligatorio: momento en que cambió la base de datos de origen, como marca de tiempo de 13 dígitos en milisegundos "systemTime": 2,//Opcional: momento en que la tarea procesó el cambio, como marca de tiempo de 13 dígitos en milisegundos "checkpointTime": 3//Opcional: hora establecida al restablecer el punto de control de sincronización, como marca de tiempo de 13 dígitos en milisegundos; suele coincidir con eventTime }, "ddl": { "text": "ADD COLUMN ...", "ddlMeta": "[SQLStatement serialized binary, expressed in base64 string]" } }, "version":"1.0.0" }
Para conocer los tipos de campo y la descripción de cada parámetro, consulte Field types y Parameter descriptions.
Formato del mensaje de latido de la tarea de sincronización
{
"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"
}
Para conocer los tipos de campo y la descripción de cada parámetro, consulte Field types y Parameter descriptions.
Formato de mensaje para cambios en los datos de origen
-
Formato del mensaje de Kafka para una inserción en el origen:
{ "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" } -
Formato del mensaje de Kafka para una actualización en el origen:
-
Si no se selecciona When one record in the source is updated, one Kafka record is generated., una actualización en el origen genera dos mensajes de Kafka: uno para el estado previo y otro para el estado posterior. Sus formatos son los siguientes:
Formato del mensaje para el estado previo a la actualización:
{ "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" }Formato del mensaje para el estado posterior a la actualización:
{ "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" } -
Si se selecciona When one record in the source is updated, one Kafka record is generated., una actualización en el origen genera un solo mensaje de Kafka que contiene tanto el estado previo como el posterior. Su formato es el siguiente:
{ "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" }
-
-
Formato del mensaje de Kafka para una eliminación en el origen:
{ "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" }
Para conocer los tipos de campo y la descripción de cada parámetro, consulte Field types y Parameter descriptions.