基于内容的路由

默认情况下,Debezi开云体育官方注册网址um流的所有更改事件从一个表中进行读取到一个静态的话题。然而,可能有情况下,您可能想要重新路由选择事件到其他主题,基于事件的内容。基于内容的路由消息的过程中所描述的基于内容的路由消息传递模式。在Debezium应用这个模式,你使用基于内容的路开云体育官方注册网址由单独的消息变换(SMT)编写表达式,计算每个事件。根据事件是如何评价的,SMT要么将事件消息路由到最初的目的地的话题,或变更主题中指定表达式。

基于内容的路由的SMT正在积极开发中。发出消息或其他细节的结构可能会改变随着开发的进展。

虽然可以使用Java创建一个定制的SMT编码路由逻辑,使用custom-coded SMT有其缺陷。例如:

  • 有必要预先编译转换并将其部署到卡夫卡连接。

  • 每个改变都需要代码重新编译和重新部署,导致僵化的操作。

基于内容的路由SMT支持脚本语言集成JSR 223Java™平台(脚本)。

开云体育官方注册网址Debezium没有附带任何JSR 223 API的实现。与Debezium使用表达式语言,你必须下载JSR 223语言的脚本引开云体育官方注册网址擎实现。例如,Groovy 3,您可以下载它的JSR 223实现https://groovy-lang.org/。JSR223实现GraalVM JavaScript可用的https://github.com/graalvm/graaljs。获得脚本引擎文件之后,您将它们添加到您的Debezium连接器插件目录,以及任何其他语言实现所使用的JAR文件。开云体育官方注册网址

设置

出于安全原因,不包括基于内容的路由SMT与Debezium连接器档案。开云体育官方注册网址相反,它提供了一个单独的工件,开云体育官方注册网址debezium-scripting-2.3.0.Final.tar.gz

使用基于内容的路由SMT Debezium连接器插件,您必须显式地添加SMT工件卡夫卡连开云体育官方注册网址接环境。重要:路由SMT后存在于卡夫卡连接实例,任何用户可以添加一个连接器实例可以运行脚本表达式。确保只有授权用户可以运行脚本表达式,一定要确保卡夫卡连接实例及其配置接口之前添加路由SMT。

动物园管理员,卡夫卡,卡夫卡连接,和一个或多个Debezium连接器开云体育官方注册网址安装,安装过滤器SMT剩下的任务:

  1. 下载脚本SMT存档

  2. 存档的内容提取到卡夫卡的Debezium插件目录连接环境。开云体育官方注册网址

  3. 获得一个jsr - 223脚本引擎实现和其内容添加到Debezium卡夫卡连接环境插件目录。开云体育官方注册网址

  4. 重新启动卡夫卡连接过程去接新的JAR文件。

Groovy语言需要以下库类路径:

  • groovy

  • groovy-json(可选)

  • groovy-jsr223

上的JavaScript语言需要以下库类路径:

  • graalvm.js

  • graalvm.js.scriptengine

例如:基本配置

配置一个Debezium连接器开云体育官方注册网址路线变化事件记录基于事件的内容,你配置ContentBasedRouterSMT在卡夫卡为连接器连接配置。

基于内容的路由的配置SMT要求您指定一个正则表达式定义的过滤标准。在配置,您将创建一个正则表达式,它定义了路由标准。表达式定义了一个模式,评估事件记录。它还指定了一个目的地的名字的话题在事件路由匹配的模式。您指定的模式可能会指定一个事件类型,比如一个表插入、更新或删除操作。你也可以定义一个模式相匹配的值在一个特定的列或行。

例如,要将所有更新(u)记录更新的话题,你可以添加以下配置连接器配置:

…变换=路线transforms.route.type = io.debezium.t开云体育官方注册网址ransforms.ContentBasedRouter transforms.route.language = jsr223。groovy transforms.route.topic.expression =价值。op = =‘u’吗?“更新”:零……

前面的示例指定的使用Groovy表达式语言。

记录不匹配模式路由默认主题。

自定义配置

前面的示例显示了一个简单的SMT配置设计过程只有DML事件,它包含一个人事处字段。其他类型的连接器可能发出的消息(心跳消息,墓碑消息或元数据信息交易或模式变化)不包含这个领域。避免处理失败,您可以定义SMT谓词选择性地应用转换的语句特定事件。

变量用于基于内容的路由表达式

开云体育官方注册网址Debezium结合某些变量评估上下文SMT。当您创建表达式来指定条件来控制路由的目的地,SMT可以查找和解释这些变量的值来评估条件表达式中。

下表列出了变量Debezium绑定到基于内容的路由SMT的评估上下文:开云体育官方注册网址

表1。基于内容的路由表达式变量
的名字 描述 类型

关键

一个关键的信息。

org.apache.kafka.connect.data.Struct

价值

消息的一个值。

org.apache.kafka.connect.data.Struct

keySchema

消息键的模式。

org.apache.kafka.connect.data.Schema

valueSchema

模式信息的价值。

org.apache.kafka.connect.data.Schema

主题

目标主题的名称。

字符串

一个Java消息头的地图。关键字段标题名称。的变量公开以下属性:

  • 价值(类型的对象)

  • 模式(类型的org.apache.kafka.connect.data.Schema)

java.util。Map < String, i开云体育官方注册网址o.debezium.transforms.scripting.RecordHeader >

一个表达式可以调用任意方法的变量。表达式应该解决一个布尔值来决定如何SMT性情消息。当路由条件表达式中评估真正的,消息被保留。当路由条件评估,消息被移除。

表达式不应该产生任何副作用。也就是说,他们不应该修改他们传递的任何变量。

选项有选择地应用转换

除了改变事件消息,Debezium连接器排放数据库变化发生时,连接器还散发出其他类型的消息,包括开云体育官方注册网址心跳消息,和元数据信息模式变化和事务。开云体育电动老虎机因为这些消息的结构不同于SMT的改变事件消息的结构设计过程,最好配置连接器有选择地应用SMT,这样流程只有预期的数据变化信息。您可以使用下列方法之一来配置连接器应用SMT选择性:

语言细节

你表达的方式基于内容的路由条件取决于您使用的脚本语言。例如,如图所示基本配置示例,当你使用Groovy表达式语言,下面的表达式将所有更新路由(u)记录更新话题,而路由默认主题的其他记录:

价值。人事处== 'u' ? 'updates' : null

其他语言使用不同的方法来表达相同的条件。

Debe开云体育官方注册网址zium MongoDB连接器发出补丁字段序列化JSON文档而不是结构。
使用MongoDB的ContentBasedRouting SMT连接器,您必须首先解除JSON数组字段到单独的文件中。
你可以通过应用MongoDBExtractNewDocumentStateSMT。

你也可以使用JSON解析器的方法在一个表达式来为每个数组项生成单独的输出文档。
例如,如果您使用Groovy表达式语言,添加groovy-json工件的类路径中,然后添加一个表达式等(新groovy.json.JsonSlurper ()) .parseText (value.after)。last_name = =“Kretchmar”

Javascript

当您使用JavaScript表达式语言,您可以调用结构体# get ()指定基于内容的路由方法条件,如以下示例:

value.get (op) = =‘u’吗?“更新”:null
Javascript与Graal.js

当您创建基于内容的路由通过使用JavaScript Graal条件。js,使用这种方法类似于一个使用Groovy。例如:

价值。人事处== 'u' ? 'updates' : null

配置选项

财产

默认的

描述

一个可选的正则表达式,对目的地的名称的主题一个事件来确定是否适用条件逻辑。如果目的地主题的名称匹配的价值topic.regex之前,转换应用条件逻辑将事件传递给这个话题。如果主题的名称不匹配的价值topic.regex、SMT将事件传递给主题修改的。

的语言表达。必须首先jsr223。例如,jsr223.groovy,或jsr223.graal.js。开云体育官方注册网址Debezium支持引导的JSR 223 API (Java™平台“脚本”)只有。

每条消息的表达式计算。必须评估字符串值非空的结果将消息路由到一个新的主题,和一个值将消息路由到默认主题。

保持

指定转换如何处理(墓碑)消息。您可以指定以下选项之一:

保持

(默认)通过传递消息。

下降

完全删除消息。

评估

条件逻辑应用于消息。