发件箱事件路由器
发件箱模式是在多个(微)服务之间安全可靠地交换数据的一种方式。发件箱模式实现避免了服务的内部状态(通常持久化在其数据库中)与需要相同数据的服务所消费的事件中的状态之间的不一致。开云体育电动老虎机
要在Debezium应用程序中实现发件箱模式,请配置Debezium连接器开云体育官方注册网址:
捕获发件箱表中的更改
应用Debezium开云体育官方注册网址发件箱事件路由器单消息转换(SMT)
配置开云体育官方注册网址为应用发件箱SMT的Debezium连接器应该仅捕获发件箱表中的更改。只有当每个发件箱表具有相同的结构时,连接器才能捕获多个发件箱表中的更改。
发件箱事件路由器SMT正在积极开发中。发出的消息的结构或其他细节可能会随着开发的进展而改变。 |
看到使用发件箱模式进行可靠的微服务数据交换了解发件箱模式为什么有用以及它是如何工作的。
有关可以运行的示例,请参见发件箱模式演示,它在Debezium示例库中。开云体育官方注册网址它包括一个如何配置Debezium连接器以运行发件箱事件路由器SMT的示例。开云体育官方注册网址
发件箱事件路由器SMT负责不支持MongoDB连接器。 |
发件箱消息示例
要了解如何配置Debezium发件箱事件路由器SMT,请考虑以下Debe开云体育官方注册网址zium发件箱消息示例:
# Kafka消息标题:“id=4d47e190-0402-4048-bc2c-89dd54343cdc”# Kafka消息时间戳:1556890294484{“{\“id\”:1,\“item\”:\“Debezium in Action\”,\“status\”:\“ENTERED\”,\“quantity\”:2,\“totalPrice\”:39.98},{\“id\”:2,\“item\”:\“Debezium for Dummi开云体育官方注册网址es\”,\“status\”:\“ENTERED\”,\“quantity\”:1,\“totalPrice\”:29.99}],\“orderDate\”:\“2019-01-31T12:13:01\”,\“customerId\”:123}”}
De开云体育官方注册网址bezium连接器被配置为应用发件箱事件路由器SMT,通过转换Debezium原始消息生成上面的消息,就像这样:
# Kafka消息键:“406c07f3-26f0-4eea-a50c-109940064b8f”# Kafka消息头:“”# Kafka消息时间戳:1556890294484{“id”:“406c07f3-26f0-4eea-a50c- 1099400b8f”,“聚合id”:“1”,“聚合类型”:“订单”,“有效负载”:“{\“id\”:1,\“lineItems\”:[{\“id\”:1,\“item\”:\“Debezium in Action\”,\“status\”:\“ENTERED\”,\“quantity\”:2,\“totalPrice\”:39.98},{\“id\”:2,\“item\”:\“Deb开云体育官方注册网址ezium for Dummies\”,\“status\”:\“ENTERED\”,\“quantity\”:\“quantity\”:\“status\”:\“enter \”,\“status\”:\“ENTERED\”,\“quantity\”:\“quantity\”:1, \“totalPrice \”:29.99}],\“orderDate \”:\“2019 - 01 - 31 - t12:13:01 \”,\“customerId \”:123}”、“时间戳”:1556890294344,“类型”:“OrderCreated”},“源”:{“版本”:“0.9.3。Final", "connector": "postgresql", "name": "dbserver1-bare", "db": "orderdb", "ts_usec": 1556890294448870, "txId": 584, "lsn": 24064704, "schema": "inventory", "table": "outboxevent", "snapshot": false, "last_snapshot_record": null, "xmin": null}, "op": "c", "ts_ms": 1556890294484}
Debezium发件箱消息的示例是基开云体育官方注册网址于默认发件箱事件路由器配置,它假设一个发件箱表结构和基于聚合的事件路由。为了自定义行为,发件箱事件路由器SMT提供了许多配置选项.
基本发件箱表
要应用默认的发件箱事件路由器SMT配置,假设您的发件箱表具有以下列:
列| Type | Modifiers --------------+------------------------+----------- id | uuid | not null aggregatetype | character varying(255) | not null aggregateid | character varying(255) | not null Type | character varying(255) | not null payload | jsonb |
列 | 效果 |
---|---|
|
包含事件的唯一ID。在发件箱消息中,此值是头。例如,您可以使用此ID删除重复的消息。 |
包含SMT附加到连接器向其发出发件箱消息的主题名称的值。默认行为是用这个值替换默认值 |
|
|
包含事件键,该键提供有效负载的ID。SMT将此值用作发出的发件箱消息中的键。这对于维护Kafka分区的正确顺序很重要。 |
|
用户定义的值,用于帮助分类或组织事件。 |
|
事件本身的表示。默认结构是JSON。该字段的内容变成以下内容之一:
要从不同的发件箱表列获取事件有效负载,请设置 |
基本配置
要配置Debezium连接器以开云体育官方注册网址支持发件箱模式,请配置发件箱。EventRouter
SMT。例如,a的基本配置. properties
文件是这样的:
变换=发件箱,…transforms.outbox.type = i开云体育官方注册网址o.debezium.transforms.outbox.EventRouter
使用Avro作为有效载荷格式
发件箱事件路由器SMT支持任意有效负载格式。的有效载荷
发件箱表中的列值被透明地传递。使用JSON的另一种选择是使用Avro。这对于消息格式治理和确保发件箱事件模式以向后兼容的方式演进是有益的。
源应用程序如何为发件箱消息有效负载生成Avro格式的内容超出了本文档的范围。一种可能是利用KafkaAvroSerializer
要序列化的类GenericRecord
实例。为了确保Kafka消息值是精确的Avro二进制数据,对连接器应用以下配置:
变换=发件箱,…transforms.outbox.type = i开云体育官方注册网址o.debezium.transforms.outbox.EventRouter value.converter = io.debezium.converters.ByteBufferConverter
默认情况下,有效载荷
列值(Avro数据)是唯一的消息值。的配置ByteBufferConverter
当值转换器传播有效载荷
列值按原样转换为Kafka消息值。
Debe开云体育官方注册网址zium连接器可以配置为发出心跳、事务元数据或模式更改事件(支持程度因连接器而异)。属性不能序列化这些事件ByteBufferConverter
因此,必须提供额外的配置,以便转换器知道如何序列化这些事件。作为一个例子,下面的配置说明了使用Apache KafkaJsonConverter
没有模式:
变换=发件箱,…transforms.outbox.type=io.开云体育官方注册网址 debezum .transforms.outbox. eventrouter value.converter=io. debezum .converters. bytebufferconverter value.converter.delegate.converter.type=org.apache.kafka.connect.json.JsonConverter value.converter.delegate.converter.type.schema .enable=false
委托转换器
方法指定实现delegate.converter.type
选择。如果转换器需要任何额外的配置选项,也可以指定它们,例如使用禁用上面所示的模式schemas.enable = false
.
发出带有附加字段的消息
发件箱表可能包含要将其值添加到发出的发件箱消息中的列。例如,考虑一个值为的发件箱表定购单
在aggregatetype
一列和另一列,eventType
,其可能值为顺序
而且order-shipped
.发射eventType
列的值,配置SMT像这样:
变换=发件箱,…transforms.outbox.type = i开云体育官方注册网址o.debezium.transforms.outbox.EventRouter transforms.outbox.table.fields.additional.placement =类型:标题:eventType
发射eventType
列值在发件箱消息信封,配置SMT如下:
变换=发件箱,…transforms.outbox.type = i开云体育官方注册网址o.debezium.transforms.outbox.EventRouter transforms.outbox.table.fields.additional.placement =类型:信封:eventType
配置选项
下表描述了可以为发件箱事件路由器SMT指定的选项。在表中,集团列表示Kafka的配置选项分类。
选项 | 默认的 | 集团 | 描述 |
---|---|---|---|
|
表格 |
指定包含唯一事件ID的发件箱表列。 |
|
|
表格 |
指定包含事件键的发件箱表列。当此列包含值时,SMT将该值用作发出的发件箱消息中的键。这对于维护Kafka分区的正确顺序很重要。 |
|
表格 |
默认情况下,发出的发件箱消息中的时间戳是Debezium事件时间戳。开云体育官方注册网址若要在发件箱邮件中使用不同的时间戳,请将此选项设置为一个发件箱表列,其中包含希望在发出的发件箱邮件中使用的时间戳。 |
||
|
表格 |
指定包含事件有效负载的发件箱表列。 |
|
|
表格 |
指定包含有效负载ID的发件箱表列。 |
|
表,信封 |
指定要添加到发件箱邮件标题或信封中的一个或多个发件箱表列。指定以逗号分隔的对列表。在每一对中,指定一个列的名称,以及希望该值在标题中还是信封中。用冒号分隔对中的值,例如:
要为列指定别名,请指定一个以别名为第三个值的三元组,例如:
第二个值是位置,而且必须始终如此 |
||
表、模式 |
方法中所描述的模式版本使用此值Kafka连接模式Javadoc。 |
||
|
路由器 |
指定发件箱表中列的名称。默认行为是,此列中的值成为连接器向其发出发件箱消息的主题名称的一部分。一个例子是预期发件箱表的描述. |
|
|
路由器 |
指定发件箱SMT在RegexRouter中应用到发件箱表记录的正则表达式。属性的设置的一部分 |
|
|
路由器 |
指定连接器向其发出发件箱消息的主题的名称。默认的主题名称为
|
|
|
路由器 |
指示是空的还是 |
|
|
开云体育官方注册网址 |
故障时确定SMT的行为
预计发件箱表中的所有更改都将被更改 |