2.2.4.6. イベント
PostgreSQL コネクターによって生成されたすべてのデータ変更イベントにはキーと値がありますが、キーと値の構造は変更イベントの発生元となるテーブルによって異なります( Topic namesを参照)。
Kafka 0.10 以降、Kafka はオプションでメッセージキーで記録でき、メッセージが作成(プロデューサーによって記録)された タイムスタンプ、または Kafka によってログに書き込まれたタイムスタンプを値として記録できます。
PostgreSQL コネクターは、すべての Kafka Connect スキーマ名が 有効な Avro スキーマ名 になるようにします。つまり、論理サーバー名はラテン文字またはアンダースコア(例:[a-z,A-Z,_])で開始し、スキーマおよびテーブル名の残りの文字(例:[a-z,A-Z,0-9,\_])で始まり、ラテン文字、数字、またはアンダースコア(例:[a-z,A-Z,0-9,\_])で始まる必要があります。そうでない場合は、すべての無効な文字が自動的にアンダースコア文字に置き換えられます。
これにより、論理サーバー名、スキーマ名、およびテーブル名に他の文字が含まれ、テーブルのフルネームを区別する唯一の文字が無効になり、アンダースコアに置き換えられたため、予期せぬ競合が発生する可能性があります。
Debezium および Kafka Connect はイベント メッセージの継続的なストリームに基づいて設計されており、これらのイベント の構造は時間の経過とともに変更される可能性があります。これは、コンシューマーが処理するのが困難な場合があるため、Kafka Connect を容易にすることで、各イベントを自己完結させることができます。すべてのメッセージキーと値には、スキーマ と ペイロード の 2 つの部分で設定されます。スキーマはペイロードの構造を記述しますが、ペイロードには実際のデータが含まれます。
2.2.4.6.1. 変更イベントのキー
指定のテーブルでは、変更イベントのキーの構造には、イベントの作成時にテーブルのプライマリーキー(または REPLICA IDENTITY
が FULL
または USING INDEX
に設定された一意のキー制約)の各列のフィールドが含まれます。
public
データベーススキーマに定義されている customers
テーブルについて考えてみましょう。
CREATE TABLE customers ( id SERIAL, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, PRIMARY KEY(id) );
database.server.name
設定プロパティーに PostgreSQL_server
の値がある場合、この定義がある限り customers
テーブルの変更イベントはすべて同じキー構造を特長とし、JSON では以下のようになります。
{ "schema": { "type": "struct", "name": "PostgreSQL_server.public.customers.Key", "optional": false, "fields": [ { "name": "id", "index": "0", "schema": { "type": "INT32", "optional": "false" } } ] }, "payload": { "id": "1" }, }
キーの スキーマ
部分には、キーの部分の内容を記述する Kafka Connect スキーマが含まれます。この場合、ペイロード
値はオプションではなく、PostgreSQL_server.public.customers.Key
という名前のスキーマによって定義された構造であり、タイプ int32
の id
という名前の必須フィールドが 1 つあります。キーの payload
フィールドの値を確認すると、値が 1
つの id
フィールドを持つ構造(JSON では単なるオブジェクト)であることがわかります。
したがって、この鍵は、id
プライマリーキー列の値が 1
である public.customers
テーブルの行( PostgreSQL_server
という名前のコネクターからの出力)を説明するものとして解釈されます。
column.blacklist
設定プロパティーを使用するとイベント値から列を削除できますが、プライマリーキーまたは一意キーのすべての列は常にイベントのキーに含まれます。
テーブルにプライマリーキーまたは一意キーがない場合は、変更イベントのキーは null になります。これは、プライマリーキー制約または一意キー制約のないテーブルの行は一意に識別できないために理にかなっています。