Debezium - CDC ad Apache Kafka

Debezium - CDC ad Apache Kafka

In labore meo, saepe in novas solutiones technicas/software productorum invenimus, informationes de quibus vix in Internet lingua Russica est. Hoc articulo unum tale lacunam exemplo e recenti usu meo implere conabor, cum opus erat configurare eventus CDC mittendis e duobus popularibus DBMSs (PostgreSQL et MongoDB) ad botrum Kafka utentem Debezium. Spero fore ut hic articulus recensionis, qui ex opere facto apparet, aliis usui sit.

Quid est Debezium et CDC in genere?

Debezium - repraesentativum CDC software genus (Capere Data Mutare) vel pressius, connexionum statuta est pro variis DBMSs compatibilibus cum compage Connectorum Apache Kafka.

haec Open Source project, licentiatus sub Apache Licentiae v2.0 et sub patrocinio Red Hat. Progressio inde ab anno MMXVI continuata est et nunc officialem sustentationem praebet pro sequentibus DBMSs: MySQL, PostgreSQL, MongoDB, SQL Server. Sunt etiam connexiones Cassandrae et Oraculi, sed momento in "primo accessu" status sunt, et novae emissiones non retro convenientiam spondent.

Si CDC cum tradito accessu comparemus (cum applicatio data e DBMS directe legit), eius praecipuae utilitates includunt exsecutionem notitiarum mutationis in ordine profluentis in gradu humili latency, alta fide et promptitudine. Duo postrema puncta efficiuntur utendo botro Kafka ut repositorium pro CDC eventuum.

Alia utilitas est quod unum exemplum ad rerum apothecas adhibetur, finis applicationis non habet sollicitandum de alimoniis diversorum operandi DBMSs.

Denique, cum sectorem nuntium admittit applicationes quae monitor mutationes in notitia ut scandere transversae. Eodem tempore, impetus in fonte notitiae minimatur, quia notitia non directe ex DBMS, sed ex botro Kafka obtinetur.

De Debezium architecturae

Usura Debezium ad hoc propositum simplex descendit:

DBMS (sicut notitia principii) β†’ connector in Kafka Iungo β†’ Apache Kafka β†’ consumptor

Ad illustrationem hic schema est a loco incepto:

Debezium - CDC ad Apache Kafka

Sed hoc schema vere non placet, quia videtur solum usus iungentis demersi posse.

Reapse aliter se res habet: implens tuum Data lacum (ultima pagina in tabula supra) Hoc non modo uti Debezium. Acta ad Apache Kafka missa adhiberi possunt applicationibus tuis ad varias condiciones tractandas. Exempli gratia:

  • de notitia nihili subtrahendo e cella;
  • notificationes mittens;
  • quaero index updates;
  • quaedam acta audit;
  • ...

In casu applicationis Javae habes et non opus/possibilitas utendi Kafka botri, est etiam possibilitas operandi per embedded-iungo. In promptu utilitas est quod excludit necessitatem additi infrastructure (in forma connectoris et Kafka). Attamen haec solutio deprecata est cum versione 1.1 et usui iam non commendatur (auxilium in futuris emissionibus amoveri potest).

This article will discuss the architectura commendata per tincidunt, in quo culpa tolerantiae et scalabilitatis praebet.

Connector configuratione

Ut mutationes sequi incipiamus maximi momenti pretii - notitia - nobis opus est:

  1. fons notitiae, qui MySQL esse potest incipiens a versione 5.7, PostgreSQL 9.6+, MongoDB 3.2+ (plenus album);
  2. Apache Kafka botrus;
  3. Kafka Connect instantia (versiones 1.x, 2.x);
  4. conformatus Debezium iungo.

Circa primum duo puncta, i.e. Processus institutionis DBMS et Apache Kafka extra ambitum articuli sunt. Sed iis, qui omnia in sandbox explicare volentibus, promptarium officiale cum exemplis promtum habet. docker-compose.yaml.

In duobus ultimis punctis fusius habitabimus.

0. Kafka Connect

Hic et ulterius in articulo omnia exempla conformationis discutiuntur in contextu imaginis Docker per tincidunt Debezium distributum. Continet omnia necessaria plugin files (connexiones) et configurationem Kafka Connectens variabiles ambitus utens.

Si Kafka Connect ex Confluent uti velis, independenter adicere debes plugins connectentium necessariorum ad indicem de quibus in plugin.path et posuit per an environment variabilis CLASSPATH. Occasus pro Kafka Iungo operarius et connexiones determinantur per imaginum conformationem quae feruntur sicut argumenta ad mandatum operantis Lorem. For more details, see documentum.

Totum processum constituendi Debeizum in versione iungentis duobus gradibus exercetur. Intueamur singula;

1. constituentes Kafka Iungo compage

Ad botrum Apache Kafka datas fluentes, ambitus specificae in compage Kafka Connectunt, ut:

  • parametri ad botrum connectendum;
  • nominum locorum, in quibus directe ipsius connectoris conformatio reponetur;
  • nomen coetus in quo iungo currit (si modus distributus adhibetur).

Officialis Docker imaginis incepti sustinet configurationem utens variabilium ambituum - hoc est quod utemur. Accipe igitur imaginem:

docker pull debezium/connect

Procuratio minimae variabilium ambituum quaeruntur ad iungendum currendum hoc modo:

  • BOOTSTRAP_SERVERS=kafka-1:9092,kafka-2:9092,kafka-3:9092 β€” Index initialis Kafka botri ministrantium ut indicem integram membrorum botri obtineat;
  • OFFSET_STORAGE_TOPIC=connector-offsets - thema repono positionum ubi iungo nunc sita est;
  • CONNECT_STATUS_STORAGE_TOPIC=connector-status β€” thema recondens statum connectoris et operas ejus;
  • CONFIG_STORAGE_TOPIC=connector-config - Argumentum ad accommodandi connexionis notitias et operas connexionis;
  • GROUP_ID=1 β€” identificatrix coetus opificum in quo munus iungens exsecutioni mandari potest; necesse est cum usura distribui (distributed) regimen.

Continentem cum his variabilibus deducimus:

docker run 
  -e BOOTSTRAP_SERVERS='kafka-1:9092,kafka-2:9092,kafka-3:9092' 
  -e GROUP_ID=1 
  -e CONFIG_STORAGE_TOPIC=my_connect_configs 
  -e OFFSET_STORAGE_TOPIC=my_connect_offsets 
  -e STATUS_STORAGE_TOPIC=my_connect_statuses  debezium/connect:1.2

Nota de Avro

Ex defectu, Debezium in forma JSON notitias scribit, quae pro sandboxes et exiguis notitiarum copia acceptum est, sed quaestio fieri potest in maximis databases oneratis. Vel potest a JSON converter est nuntiis utendo serialize aVRO in forma binaria, quae sarcinam in I/O subsystem in Apache Kafka minuit.

Uti Avro separatum explicare debes schema-subcriptio (Ad tabulas recondens). Variabiles pro convertente hoc videbunt:

name: CONNECT_VALUE_CONVERTER_SCHEMA_REGISTRY_URL
value: http://kafka-registry-01:8081/
name: CONNECT_KEY_CONVERTER_SCHEMA_REGISTRY_URL
value: http://kafka-registry-01:8081/
name: VALUE_CONVERTER   
value: io.confluent.connect.avro.AvroConverter

Singula in Avro utentes et subcriptio constituentes sunt extra ambitum huius articuli - infra, ad claritatem JSON utemur.

2. Configurans ipsum iungo

Nunc directe ad ipsam connexionis conformationem ire potes, quae notitia ex fonte leget.

Inspiciamus exemplum connexorum pro duobus DBMSs: PostgreSQL et MongoDB, in quibus experientiam habeo et in quibus differentiae sunt (quamvis parvae, sed in aliquibus casibus significantes!).

Configuratio in notatione JSON describitur et ad Kafka Iungo adhibita postulatio postulet.

2.1. PostgreSQL

Exemplum iungo configuration pro PostgreSQL:

{
  "name": "pg-connector",
  "config": {
    "connector.class": "io.debezium.connector.postgresql.PostgresConnector",
    "plugin.name": "pgoutput",
    "database.hostname": "127.0.0.1",
    "database.port": "5432",
    "database.user": "debezium",
    "database.password": "definitelynotpassword",
    "database.dbname" : "dbname",
    "database.server.name": "pg-dev",
    "table.include.list": "public.(.*)",
    "heartbeat.interval.ms": "5000",
    "slot.name": "dbname_debezium",
    "publication.name": "dbname_publication",
    "transforms": "AddPrefix",
    "transforms.AddPrefix.type": "org.apache.kafka.connect.transforms.RegexRouter",
    "transforms.AddPrefix.regex": "pg-dev.public.(.*)",
    "transforms.AddPrefix.replacement": "data.cdc.dbname"
  }
}

Principium operationis connectoris post hunc paro- chum omnino simplex est;

  • Cum primum emittitur, coniungitur cum datorum in configuratione determinatorum et in modo incipit initial snapshot "mittens ad Kafka initialem notitiarum paro of usura conditionalem nactus SELECT * FROM table_name.
  • Postquam initialization perfecta est, iungo in modum legendi mutationes ex files PostgreSQL WAL pergit.

Circa optiones usus est:

  • name - nomen iungonis pro quo figura infra describitur; in futuro, hoc nomen laborare cum iungente (i.e., statum/sile/renovare configurationem videre) per Kafka Connect CETERA API;
  • connector.class - DBMS iungo genus quod a iungente figuratum adhibebitur;
  • plugin.name - nomen plugin pro logica decoctione notitiarum e lima WAL. Praesto eligere ex wal2json, decoderbuffs ΠΈ pgoutput. Duo priora institutionem requirunt extensionum convenientium in DBMS, et pgoutput pro PostgreSQL versio 10 et superior non requirit additos manipulationes;
  • database.* - optiones connectendi cum database, ubi database.server.name β€” PostgreSQL instantia nomen ad formandum thema nomen in Kafka botrum;
  • table.include.list β€” index tabularum in quibus mutationes indagare volumus; certa in forma schema.table_name; non possunt una cum table.exclude.list;
  • heartbeat.interval.ms β€” intervallum (in milliseconds) cum quo connector nuntios pulsationis mittit ad locum specialem;
  • heartbeat.action.query - petitio quae fiet, cum singula nuntium pulsationis mittens (optio in versione 1.1) apparuit;
  • slot.name - nomen replicationis socors quod a iungente adhibebitur;
  • publication.name - Nomen publication in PostgreSQL, quo iungo utitur. Si non est, Debezium creare conabitur. Si usor sub quo fit nexus ius non habet ad hanc actionem satis, iungo errore terminabitur;
  • transforms prorsus determinat quam mutare nomen in scopum topic:
    • transforms.AddPrefix.type utemur expressionibus regularibus indicat;
    • transforms.AddPrefix.regex - larva quae nomen scopo argumenti redefines;
    • transforms.AddPrefix.replacement β€” proxime id quod nos depingimus.

De pulsatio et immutat

Defalta, iungo notitias ad Kafka mittit pro unoquoque negotio commisso, et eius LSN (Consequentiae Log Number) in thema servitii commemoratur. offset. Sed quid fit si iungo configuratur ut non integram datorum datorum partem, sed tantum partem tabularum suarum (in quibus notitia updates non frequentius occurrit) legatur?

  • Connector tabulas wal leget et rem ullam ad tabulas vigilantiam non deprehendet.
  • Ergo nec in re, nec in replicatione socors locum suum renovabit.
  • Hoc in vicem evenit in TABULA WALTiana, quae in orbe tenuit et verisimile est ex spatio orbis currens.

Idque ubi bene succurrit. heartbeat.interval.ms ΠΈ heartbeat.action.query. His in binis optionibus utens, efficit ut petitionem mutet datam in mensa separata singulis diebus pulsatio emissa sit. Ita, LSN in quo iunctio nunc sita est (in replicatione socors) constanter renovatur. Hoc permittit DBMS ut lima WA removendi quae iam non sunt necessaria. Plus discere potes quomodo optiones operantur in documentum.

Alius optio dignus diligentius est transforms. Licet plus de commodo et pulchritudine...

Defalta, Debezium argumenta nominandi consilium gignit utentes: serverName.schemaName.tableName. Ut non semper commodo. Optiones transforms Locutionibus regularibus uti potes ad indicem tabularum definiendum, eventus e quibus opus est ad thema pellendum cum nomine proprio.

In nostra configuratione agentes transforms hoc fit: omnes CDC eventus a database monitored ibo ad thema cum nomine data.cdc.dbname. Alioquin (sine his uncinis), Debezium per default crearet thema cuiusque mensae simile: pg-dev.public.<table_name>.

Connector limitationes

Ut descriptionem iungentis configurationis pro PostgreSQL concludere, valet loqui de sequentibus notis / limitationibus operationis:

  1. Munus connectoris pro PostgreSQL innititur notioni logicae decoding. ergo ille non track petitiones ad mutare database compages (DDL) - Itaque haec notitia in locis non erit.
  2. Cum replicatio foramina adhibentur, connectens iungo potest tantum ut primores DBMS instantia.
  3. Si usor sub quo iungo coniungit cum datorum iura solum legit, tunc ante primam launch opus erit manually replicationem socors creare et evulgare database.

Applicando configuratione

Itaque, configurationem nostram in iungo oneremus:

curl -i -X POST -H "Accept:application/json" 
  -H  "Content-Type:application/json"  http://localhost:8083/connectors/ 
  -d @pg-con.json

Reprimimus quod download felix fuit et iungo incepit:

$ curl -i http://localhost:8083/connectors/pg-connector/status 
HTTP/1.1 200 OK
Date: Thu, 17 Sep 2020 20:19:40 GMT
Content-Type: application/json
Content-Length: 175
Server: Jetty(9.4.20.v20190813)

{"name":"pg-connector","connector":{"state":"RUNNING","worker_id":"172.24.0.5:8083"},"tasks":[{"id":0,"state":"RUNNING","worker_id":"172.24.0.5:8083"}],"type":"source"}

Magna: erecta et parata est. Nunc simulabimus esse consumpturam et cum Kafka coniunge, post quam addemus et mutabimus ingressum in mensa:

$ kafka/bin/kafka-console-consumer.sh 
  --bootstrap-server kafka:9092 
  --from-beginning 
  --property print.key=true 
  --topic data.cdc.dbname

postgres=# insert into customers (id, first_name, last_name, email) values (1005, 'foo', 'bar', '[email protected]');
INSERT 0 1
postgres=# update customers set first_name = 'egg' where id = 1005;
UPDATE 1

In nostro argumento sic proponendum erit.

Longissimum JSON cum mutationibus nostris

{
"schema":{
"type":"struct",
"fields":[
{
"type":"int32",
"optional":false,
"field":"id"
}
],
"optional":false,
"name":"data.cdc.dbname.Key"
},
"payload":{
"id":1005
}
}{
"schema":{
"type":"struct",
"fields":[
{
"type":"struct",
"fields":[
{
"type":"int32",
"optional":false,
"field":"id"
},
{
"type":"string",
"optional":false,
"field":"first_name"
},
{
"type":"string",
"optional":false,
"field":"last_name"
},
{
"type":"string",
"optional":false,
"field":"email"
}
],
"optional":true,
"name":"data.cdc.dbname.Value",
"field":"before"
},
{
"type":"struct",
"fields":[
{
"type":"int32",
"optional":false,
"field":"id"
},
{
"type":"string",
"optional":false,
"field":"first_name"
},
{
"type":"string",
"optional":false,
"field":"last_name"
},
{
"type":"string",
"optional":false,
"field":"email"
}
],
"optional":true,
"name":"data.cdc.dbname.Value",
"field":"after"
},
{
"type":"struct",
"fields":[
{
"type":"string",
"optional":false,
"field":"version"
},
{
"type":"string",
"optional":false,
"field":"connector"
},
{
"type":"string",
"optional":false,
"field":"name"
},
{
"type":"int64",
"optional":false,
"field":"ts_ms"
},
{
"type":"string",
"optional":true,
"name":"io.debezium.data.Enum",
"version":1,
"parameters":{
"allowed":"true,last,false"
},
"default":"false",
"field":"snapshot"
},
{
"type":"string",
"optional":false,
"field":"db"
},
{
"type":"string",
"optional":false,
"field":"schema"
},
{
"type":"string",
"optional":false,
"field":"table"
},
{
"type":"int64",
"optional":true,
"field":"txId"
},
{
"type":"int64",
"optional":true,
"field":"lsn"
},
{
"type":"int64",
"optional":true,
"field":"xmin"
}
],
"optional":false,
"name":"io.debezium.connector.postgresql.Source",
"field":"source"
},
{
"type":"string",
"optional":false,
"field":"op"
},
{
"type":"int64",
"optional":true,
"field":"ts_ms"
},
{
"type":"struct",
"fields":[
{
"type":"string",
"optional":false,
"field":"id"
},
{
"type":"int64",
"optional":false,
"field":"total_order"
},
{
"type":"int64",
"optional":false,
"field":"data_collection_order"
}
],
"optional":true,
"field":"transaction"
}
],
"optional":false,
"name":"data.cdc.dbname.Envelope"
},
"payload":{
"before":null,
"after":{
"id":1005,
"first_name":"foo",
"last_name":"bar",
"email":"[email protected]"
},
"source":{
"version":"1.2.3.Final",
"connector":"postgresql",
"name":"dbserver1",
"ts_ms":1600374991648,
"snapshot":"false",
"db":"postgres",
"schema":"public",
"table":"customers",
"txId":602,
"lsn":34088472,
"xmin":null
},
"op":"c",
"ts_ms":1600374991762,
"transaction":null
}
}{
"schema":{
"type":"struct",
"fields":[
{
"type":"int32",
"optional":false,
"field":"id"
}
],
"optional":false,
"name":"data.cdc.dbname.Key"
},
"payload":{
"id":1005
}
}{
"schema":{
"type":"struct",
"fields":[
{
"type":"struct",
"fields":[
{
"type":"int32",
"optional":false,
"field":"id"
},
{
"type":"string",
"optional":false,
"field":"first_name"
},
{
"type":"string",
"optional":false,
"field":"last_name"
},
{
"type":"string",
"optional":false,
"field":"email"
}
],
"optional":true,
"name":"data.cdc.dbname.Value",
"field":"before"
},
{
"type":"struct",
"fields":[
{
"type":"int32",
"optional":false,
"field":"id"
},
{
"type":"string",
"optional":false,
"field":"first_name"
},
{
"type":"string",
"optional":false,
"field":"last_name"
},
{
"type":"string",
"optional":false,
"field":"email"
}
],
"optional":true,
"name":"data.cdc.dbname.Value",
"field":"after"
},
{
"type":"struct",
"fields":[
{
"type":"string",
"optional":false,
"field":"version"
},
{
"type":"string",
"optional":false,
"field":"connector"
},
{
"type":"string",
"optional":false,
"field":"name"
},
{
"type":"int64",
"optional":false,
"field":"ts_ms"
},
{
"type":"string",
"optional":true,
"name":"io.debezium.data.Enum",
"version":1,
"parameters":{
"allowed":"true,last,false"
},
"default":"false",
"field":"snapshot"
},
{
"type":"string",
"optional":false,
"field":"db"
},
{
"type":"string",
"optional":false,
"field":"schema"
},
{
"type":"string",
"optional":false,
"field":"table"
},
{
"type":"int64",
"optional":true,
"field":"txId"
},
{
"type":"int64",
"optional":true,
"field":"lsn"
},
{
"type":"int64",
"optional":true,
"field":"xmin"
}
],
"optional":false,
"name":"io.debezium.connector.postgresql.Source",
"field":"source"
},
{
"type":"string",
"optional":false,
"field":"op"
},
{
"type":"int64",
"optional":true,
"field":"ts_ms"
},
{
"type":"struct",
"fields":[
{
"type":"string",
"optional":false,
"field":"id"
},
{
"type":"int64",
"optional":false,
"field":"total_order"
},
{
"type":"int64",
"optional":false,
"field":"data_collection_order"
}
],
"optional":true,
"field":"transaction"
}
],
"optional":false,
"name":"data.cdc.dbname.Envelope"
},
"payload":{
"before":{
"id":1005,
"first_name":"foo",
"last_name":"bar",
"email":"[email protected]"
},
"after":{
"id":1005,
"first_name":"egg",
"last_name":"bar",
"email":"[email protected]"
},
"source":{
"version":"1.2.3.Final",
"connector":"postgresql",
"name":"dbserver1",
"ts_ms":1600375609365,
"snapshot":"false",
"db":"postgres",
"schema":"public",
"table":"customers",
"txId":603,
"lsn":34089688,
"xmin":null
},
"op":"u",
"ts_ms":1600375609778,
"transaction":null
}
}

In utroque casu, monumenta constant clavem (PK) recordi mutatae, et ipsa mutationum essentia: quid recordum ante erat et quid post factum est.

  • In casu de INSERT: Valorem prius (before) pares nullet post - lineola inserta est.
  • In casu de UPDATE: apud payload.before prior lineae status ostenditur, et in payload.after β€” nova cum essentia mutationum.

2.2 MongoDB

Hoc iungo utitur vexillum replicationis mechanismi MongoDB, informationes legens ex oplog nodi primariae DBMS.

Similia cum connectore iam descripto pro PgSQL, hic quoque in primo initio, prima notitia snapshots accipitur, post quod iungo permutat ad modum legendi oplog.

Exemplum figurationis:

{
"name": "mp-k8s-mongo-connector",
"config": {
"connector.class": "io.debezium.connector.mongodb.MongoDbConnector",
"tasks.max": "1",
"mongodb.hosts": "MainRepSet/mongo:27017",
"mongodb.name": "mongo",
"mongodb.user": "debezium",
"mongodb.password": "dbname",
"database.whitelist": "db_1,db_2",
"transforms": "AddPrefix",
"transforms.AddPrefix.type": "org.apache.kafka.connect.transforms.RegexRouter",
"transforms.AddPrefix.regex": "mongo.([a-zA-Z_0-9]*).([a-zA-Z_0-9]*)",
"transforms.AddPrefix.replacement": "data.cdc.mongo_$1"
}
}

Ut videre potes, nullae optiones novae hic cum exemplo praecedente comparatae sunt, sed numerus optionum responsabilium cum datorum datorum eorumque praefixis redactus est.

occasus transforms hoc tempore sequentia faciunt: nomen scopi thematis e schemate transformant <server_name>.<db_name>.<collection_name> Π² data.cdc.mongo_<db_name>.

culpa tolerantia

Exitus culpae tolerantiae et promptitudinis nostrae aetatis acutior est quam umquam - praesertim cum de notitia et transactionibus loquimur, et notitiarum mutationum vestigia in hac re non recedunt. Intueamur quid in principio errare possit et quid Debezium in utroque casu futurum sit.

Sunt tres optiones opt-e:

  1. Kafka Iungo defectum. Si Connect configuratur ad operandum in modo distributo, hoc requirit plures operarios ad idem coetus constituendum. Deinde, si unus ex eis deficiat, iungo in alium artificem silebitur et perseveret lectionem ultimam commisso loco in themate Kafka.
  2. Damnum connectivity cum Kafka botri. Connector solum cessabit legere in positione quae ad Kafka mittere neglexit et per intervalla illud rescindere temptabit donec conatum succedat.
  3. Data fons unavailability. Connector conabitur reconnect ad fontem sicut figuratum. Conatus est default utens XVI exponentialis backoff. Post diem decimum 16 frustra conatum, negotium signabitur defecit et necesse est ut manually sileo eam per Kafka Iungo CETERA interface.
    • In casu de PostgreSQL in notitia non peribit, quod Replicatio foramina utens prohibebit te lima WA delendo quae per iungo non legeris. In hoc casu etiam in nummo declivis est: si retis connectivity inter iungentem et DBMS diu disrumpitur, fieri potest ut spatium orbis exeat, et hoc in defectum ducere potest. totam DBMS.
    • In casu de MySQL fasciculi binlogorum ab ipso DBMS rotari possunt antequam connectivity restituatur. Hoc iungo ut in statum deficientem introire faciam et operationem normalem restituas, necesse est ut sileo in initiali snapshot modum legendi ex binlogs continuandi.
    • in MongoDB. Documenta affirmat: mores iungo in eventu qui tabulae log/oplog deletae sunt et iungo non potest continue legere e situ ubi desinit idem omnibus DBMSs. Significat quod iungo ibit in rempublicam defecit et require restarting in mode initial snapshot ".

      Sed sunt exceptiones. Si connector diu disiunctus est (vel instantiam MongoDB attingere non potuit), et oplogum per gyrationem hoc tempore perrectum est, tum cum nexus restituitur, iungo placide perget notitias legere ex positione prima in promptu; quam ob causam nonnullae notitiae in Kafka non feriet.

conclusio,

Debezium prima experientia est cum CDC systemata et altiore valde positivo. Proiectum conciliavit cum subsidio majorum DBMSs, commoditatis configurationis, subsidii aggregati, et communitatis activae. Pro his, qui in usu sunt, commendo ut duces pro te legere Kafka Connect ΠΈ Debezium.

Comparatus cum JDBC iungo pro Kafka Connect, maxima utilitas Debezii est quod mutationes ex DBMS lignis leguntur, quae notitias minimas latency recipi sinit. JDBC Connector (ex Kafka Connector) tabulam monitoriam certo intervallo quaerit et (ob eandem causam) nuntios non generat cum notitia deleta est (quomodo potes data interrogatione quae non est?).

Ad similes quaestiones solvendas, ad sequentes solutiones attendere potes (praeter Debezium);

PS

Lege etiam in nostro diario:

Source: www.habr.com