您正在查看过时的Debezium版本的文档。开云体育官方注册网址
如果您想查看本页最新的稳定版本,请前往在这里

发件箱夸克扩展

概述

这个扩展的灵感来自发件箱事件路由器单消息转换(SMT)。正如博客文章中讨论的那样使用发件箱模式进行可靠的微服务数据交换在美国,微服务通常需要彼此交换信息,而处理这种情况的一个很好的方法是使用发件箱模式结合Debezium的发件箱事件路由器SMT。开云体育官方注册网址

下图显示了该模式的整体架构:

发件箱模式

发件箱扩展的目标是提供一个Quarkus应用程序使用可重用的、高度可配置的组件,该组件促进了与Debezium的CDC连接器管道配对的发件箱模式的使用,从而与所述数据的任何消费者可靠且异步地共享数据。开云体育官方注册网址

开始

为了开始使用Debezium Outbox Quarku开云体育官方注册网址s扩展,需要将扩展添加为Quarkus应用程序的一部分,如下所示:

 io.开云体育官方注册网址debezium debezium-quarku -outbox 1.9.7。最终版本> < / > < /依赖

扩展为应用程序提供io.开云体育官方注册网址debezium.outbox.quarkus.ExportedEvent接口。类将实现此接口,并且事件将使用javax.enterprise.event.Event类。

ExportedEvent接口被参数化,以允许应用程序指定由事件发出的几个属性所使用的Java类型。重要的是,对于给定的夸克应用程序,所有的实现ExportedEvent接口必须使用相同的参数类型,否则将引发构建失败,因为所有事件都将使用相同的底层数据库表。开云体育电动老虎机

例子

的实现ExportedEvent接口,表示已创建的订单:

OrderCreatedEvent.java
公共类OrderCreatedEvent实现了ExportedEvent {private static final String TYPE = "Order";private static final String EVENT_TYPE = "OrderCreated";private final long orderId;private final JsonNode;即时时间戳;public OrderCreatedEvent(即时createdAt,订单订单){此。orderId = order.getId();这一点。时间戳= createdAt;这一点。jsonNode = convertToJson(order); } @Override public String getAggregateId() { return String.valueOf(orderId); } @Override public String getAggregateType() { return TYPE; } @Override public JsonNode getPayload() { return jsonNode; } @Override public String getType() { return EVENT_TYPE; } @Override public Instant getTimestamp() { return timestamp; } @Override public Map getAdditionalFieldValues() { // no additional fields return Collections.emptyMap(); } }

下面的示例说明了OrderService它发出OrderCreatedEvent

OrderService.java
@注入OrderRepository;@ inject事件< ExportedEvent < ?>>事件;@事务性公共订单addOrder(订单订单){订单= orderRepository.save(订单);事件。fire(new OrderCreatedEvent(Instant.now(), order));返回订单;}}

当应用程序代码通过调用触发事件时事件#火()时,发件箱扩展将收到事件发生的通知,并将事件的内容持久化到当前事务范围内的发件箱事件表中。Debe开云体育官方注册网址zium CDC连接器将与发件箱事件路由器一起监视该表,并将负责使用CDC事件转发数据。

要查看完整的端到端演示,请使用发件箱下面的示例演示了两个Quarkus微服务应用程序在下达或取消订单时使用发件箱模式在它们之间共享数据。

附加字段映射

Debe开云体育官方注册网址zium发件箱SMT可以配置为读取其他字段,并将这些字段值作为事件标头或事件值的一部分发出。

为了传递由Quarkus发件箱扩展保存的其他字段映射,配置属性quarkus.开云体育官方注册网址debezium-outbox.additional-fields必须在application.properties.属性的应用程序实现传递的附加字段定义的逗号分隔列表ExportedEvent接口。

这个以逗号分隔的列表中的每个条目必须遵循以下格式:

<字段>:< field-java-type > [: < field-column-definition > [: < field-jpa-attribute-converter >]]

该模式指出字段的名称和java类型是必需的,而列定义和JPA属性转换器是可选的。但是,请注意,如果您希望指定JPA属性转换器,那么必须指定列定义。

下面的示例演示如何定义名为customer_name在Java中表示为字符串并将其存储在发件箱表中VARCHAR (100)列。这个例子还展示了一个JPA Attribute转换器,它定义了强制字符串存储为大写。

application.properties
quarkus.开云体育官方注册网址debezium-outbox.additional-fields = customer_name:字符串:varchar (100): example.UpperCase

一旦在应用程序中配置了字段. properties文件中,应用程序的代码需要通过其导出的事件提供相应的值。类扩展的应用程序类ExportedEvent需要重写所调用的方法getAdditionalFieldValues ()并返回地图附加字段名和值的。

在下面的示例中,我们将展示如何指定customer_name字段,值为Acme的商品.使用我们的OrderCreatedEvent从上面的示例部分,我们扩展了事件:

OrderCreatedEvent.java
公共类OrderCreatedEvent实现了ExportedEvent{…@覆盖公共地图<字符串,对象> getAdditionalFieldValues(){返回集合。singletonMap("customer_name", "Acme Goods");}}

额外的字段映射允许为每个字段指定一个JPA属性转换器。

在这个例子中,我们定义的例子。大写字母这将在插入之前将任何提供的字符串值转换为大写。JPA属性转换器允许将这种类型的行为与调用站点分离,从而允许重用公共行为。

应用程序中的配置. properties文件及更新OrderCreateedEvent为了提供这些额外的字段和值,Debezium发件箱SMT现在可以访问这些额外的字段值,并将它们放置在发开云体育官方注册网址出的事件中。

配置

可以通过在Quarkus中设置选项来配置发件箱扩展application.properties文件。该扩展可以使用默认配置开箱即用,但此配置可能并不适用于每种情况。

构建时配置选项

配置属性

类型

默认的

quarkus.开云体育官方注册网址debezium-outbox.table-name

创建发件箱表时要使用的表名。

字符串

OutboxEvent

字符串

id

quarkus.开云体育官方注册网址debezium-outbox.id.column-definition

事件id开云体育电动老虎机列的数据库特定列定义。
例如,Uuid不为空

字符串

Uuid不为空

字符串

aggregateid

quarkus.开云体育官方注册网址debezium-outbox.aggregate-id.column-definition

聚合id开云体育电动老虎机的数据库特定列定义。
例如,Varchar(50)不为空

字符串

Varchar(255)不为空

quarkus.开云体育官方注册网址debezium-outbox.aggregate-id.converter

事件键列的JPA attributecconverter。
例如,com.company.TheAttributeConverter

字符串

字符串

aggregatetype

quarkus.开云体育官方注册网址debezium-outbox.aggregate-type.column-definition

聚合类型开云体育电动老虎机的数据库特定列定义。
例如,Varchar(15)不为空

字符串

Varchar(255)不为空

quarkus.开云体育官方注册网址debezium-outbox.aggregate-type.converter

事件聚合类型列的JPA attributecconverter。
例如,com.company.TheAttributeConverter

字符串

字符串

类型

quarkus.开云体育官方注册网址debezium-outbox.type.column-definition

事件类型开云体育电动老虎机的数据库特定列定义。
例如,Varchar(50)不为空

字符串

Varchar(255)不为空

quarkus.开云体育官方注册网址debezium-outbox.type.converter

事件类型列的JPA attributecconverter。
例如,com.company.TheAttributeConverter

字符串

字符串

时间戳

quarkus.开云体育官方注册网址debezium-outbox.timestamp.column-definition

事件时间开云体育电动老虎机戳的特定于数据库的列定义。
例如,时间戳不为空

字符串

时间戳不为空

quarkus.开云体育官方注册网址debezium-outbox.timestamp.converter

事件时间戳列的JPA attributecconverter。
例如,com.company.TheAttributeConverter

字符串

字符串

有效载荷

quarkus.开云体育官方注册网址debezium-outbox.payload.column-definition

事件有效开云体育电动老虎机负载的数据库特定列定义。
例如,文本不为空

字符串

VARCHAR (8000)

quarkus.开云体育官方注册网址debezium-outbox.payload.converter

事件有效负载列的JPA attributecconverter。
例如,com.company.TheAttributeConverter

字符串

quarkus.开云体育官方注册网址debezium-outbox.payload.type

Hibernate的完全限定类名用户类型实现。
例如,io.company.types.JsonNodeBinaryType

字符串

字符串

tracingspancontext

quarkus.开云体育官方注册网址debezium-outbox.tracingspancontext.column-definition

跟踪跨度开云体育电动老虎机上下文列的数据库特定列定义。
例如,文本不为空

字符串

VARCHAR (256)

quarkus.开云体育官方注册网址debezium-outbox.additional-fields

以逗号分隔的附加字段映射列表,这些映射将持久化在发件箱表中。

看到其他字段映射有关格式和用法的详细信息。

字符串

生成时配置默认值将与发件箱事件路由器SMT一起使用。当不使用默认值时,请确保SMT配置匹配。

运行时配置选项

配置属性

类型

默认的

quarkus.开云体育官方注册网址debezium-outbox.remove-after-insert

在插入发件箱条目后是否删除。

删除条目不会影响Debezium连接器发射CDC事件的能力。开云体育官方注册网址这是一种防止表的底层存储空间随时间增长的方法。

布尔

真正的

分布式跟踪

该功能目前处于孵化状态,即准确的语义,配置选项等可能会根据我们收到的反馈在未来的版本中改变。具体来说,在未来的版本中,分布式跟踪支持将被开放遥测规范的支持所取代。

扩展支持分布式跟踪。看到跟踪文档欲知详情。