发件箱Quarkus扩展

概述

这个扩展的启发发件箱活动路由器单一的消息转换(SMT)。博客文章中讨论可靠的Microservices数据交换与发件箱模式,microservices通常需要彼此交换信息和一个非常好的方法来处理使用发件箱模式结合Debezium发件箱事件路由器SMT。开云体育官方注册网址

下面的图片显示了此模式的总体架构:

发件箱模式

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

开始

为了开始使用Debezium发件箱Quarkus扩展,扩开云体育官方注册网址展需要添加部分Quarkus应用程序如下:

<依赖> < groupId > io.debez开云体育官方注册网址ium < / groupId > < artifactId > debezium-quarkus-outbox < / artifactId > <版本> tripwire。最后< /版本> < /依赖>

扩展为应用程序提供了io.开云体育官方注册网址debezium.outbox.quarkus.ExportedEvent接口。我们估计一个应用程序类将实现这个接口,事件将会发出使用javax.enterprise.event.Event类。

ExportedEvent接口参数化允许应用程序指定多个属性所使用的Java类型发出的事件。是很重要的对于一个给定的Quarkus应用程序,所有的实现ExportedEvent接口必须使用相同的参数类型或构建失败就会抛出以来所有事件都将使用相同的底层数据库表。开云体育电动老虎机

例子

下面的例子说明了一个实现的ExportedEvent创建接口代表一个订单:

OrderCreatedEvent.java
公共类OrderCreatedEvent实现ExportedEvent <字符串,JsonNode >{私有静态最终字符串类型=“秩序”;私有静态最终字符串EVENT_TYPE =“OrderCreated”;私人最终长orderId;私人最终JsonNode JsonNode;私人最后即时时间戳;公共OrderCreatedEvent(即时createdAt订单顺序){。orderId = order.getId ();这一点。时间戳= createdAt;这一点。jsonNode = convertToJson(秩序); } @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
@ApplicationScoped公开课OrderService {@ inject OrderRepository OrderRepository;@ inject事件< ExportedEvent < ?,? > >事件;@ transactional公共秩序addOrder(订单顺序){= orderRepository.save顺序(顺序);事件。火(新OrderCreatedEvent (Instant.now(),顺序));返回订单;}}

当应用程序代码触发事件通过调用事件#火(),发件箱扩展将通知事件发生和持续的内容事件变成了发件箱事件表当前事务的范围内。Debe开云体育官方注册网址zium CDC连接器与发件箱事件路由器将监控这个表,负责传送数据使用CDC事件。

看到一个完整的端到端演示,发件箱使用发件箱模式示例说明了两个Quarkus microservice应用程序之间共享数据他们当订单被放置或取消。

反应性变异

如果你的应用程序使用被动的数据源,或者Hibernate的反应,你必须使用稍微不同的配置扩展添加到您的应用程序。

例如,使用以下配置导入反应变量的扩展:

<依赖> < groupId > io.debez开云体育官方注册网址ium < / groupId > < artifactId > debezium-quarkus-outbox-reactive < / artifactId > <版本> tripwire。最后< /版本> < /依赖>

反应性扩展为应用程序提供了相同的io.开云体育官方注册网址debezium.outbox.quarkus.ExportedEvent界面无电抗变体,但它也提供了开云体育官方注册网址DebeziumOutboxHandler类。注入开云体育官方注册网址DebeziumOutboxHandler豆很快持久化到一个应用程序提供了一个方法ExportedEvent发件箱表。下面的例子展示了一个使用相同的调用ExportedEvent在前面的例子:

OrderService.java
@ApplicationScoped公开课OrderService {@ inject DebeziumOut开云体育官方注册网址boxHandler DebeziumOutboxHandler;@ inject OrderRepository OrderRepository;@ inject事件< ExportedEvent < ?,? > >事件;@ReactiveTransactional公立大学<订单> addOrder(订单订单){返回orderRepository.persistAndFlush(秩序)打电话给(debeziumOutboxHandler。开云体育官方注册网址persistToOutbox(新OrderCreatedEvent (Instant.now(),顺序)));}}

persistToOutbox方法返回一个大学;因此,它必须遵守由订户ito接收结果。关于使用兵变库的更多信息来构建活性应用程序,看到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属性定义转换器,迫使字符串的存储大写。

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

一旦字段(s)在应用程序的配置. properties文件,应用程序的代码需要提供相应的值通过其出口活动。为了做到这一点,应用程序类,它扩展了ExportedEvent需要覆盖调用的方法getAdditionalFieldValues ()并返回一个地图额外的字段名称和值。

在接下来的例子中,我们展示了如何指定customer_name字段的值Acme的商品。使用我们的OrderCreatedEvent从上面的示例一节中,我们扩展事件:

OrderCreatedEvent.java
公共类OrderCreatedEvent实现ExportedEvent <字符串,JsonNode > {…@Override公共地图<字符串、对象> getAdditionalFieldValues(){返回集合。singletonMap (“customer_name”、“Acme商品”);}}

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

在这个例子中,我们定义的example.UpperCase这将在插入之前提供的任何字符串值转换为大写。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) not null

字符串

VARCHAR (255) NOT NULL

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

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

字符串

字符串

aggregatetype

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

聚合的特开云体育电动老虎机定于数据库的列定义类型。
例如,varchar (15) not null

字符串

VARCHAR (255) NOT NULL

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

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

字符串

字符串

类型

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

事件类型开云体育电动老虎机的特定于数据库的列定义。
例如,varchar (50) not null

字符串

VARCHAR (255) NOT NULL

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

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

字符串

字符串

时间戳

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

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

字符串

时间戳不空

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

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

字符串

字符串

有效载荷

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

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

字符串

VARCHAR (8000)

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

JPA AttributeConverter事件有效负载的列。
例如,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连接器无法发射中心事件。开云体育官方注册网址这是用来防止表的底层存储随时间增长。

布尔

真正的

分布式跟踪

这个功能目前正在酝酿状态,即精确的语义,配置选项等可能会改变在未来修订,根据我们得到的反馈。具体来说,分布式跟踪支持将被替换为在将来的版本中支持开放遥测技术规范。

扩展支持分布式跟踪。看到跟踪文档为更多的细节。