是否可以仅将 SMT(单消息转换)应用于来自指定主题的消息

Posted

技术标签:

【中文标题】是否可以仅将 SMT(单消息转换)应用于来自指定主题的消息【英文标题】:Is it possible to apply SMT (Single Message Transforms) to messages from specified topics only 【发布时间】:2019-09-02 03:41:57 【问题描述】:

我正在使用 Debezium mysql 连接器将数据库更改事件从 MySql 数据库流式传输到 Kafka。我需要对来自某些指定表(但不是来自其他表)的记录应用特定的转换。有没有办法只使用 Kafka Connect 单消息转换(没有 Kafka Streams 或 KSQL)?我什至不介意编写自定义 SMT。但我找不到如何指定来自哪些表/主题的消息应用 SMT。谢谢。

[UPD] 经过简短的调查,我决定为此使用 KSQL。谢谢大家的解答

【问题讨论】:

您可以为每个表创建不同的连接器,然后将 SMT 应用于仅需要的主题 是的,这也是一种选择,谢谢。但在我考虑任何其他情况之前,我希望有人确认仅将 SMT 应用于特定主题是不可能的.. 【参考方案1】:

您不能仅将 SMT 应用于特定主题。连接器无论是 Sink 还是 Source 始终将定义的 SMT 应用于它处理的每条消息。

有一个选项是 SMT 有一些复杂的逻辑并且依赖于消息中的一些数据(主题名称、分区号、键等)做一些工作或不做一些工作。不推荐使用 describe 方法,因为 SMT 应该进行轻量级处理(对于更复杂的您应该使用 Kafka Streams)。这就是org.apache.kafka.connect.transforms.*的SMT没有这种逻辑的原因。

如果您只想将 SMT 应用于特定主题,您可以为每个表(主题)创建不同的连接器。

【讨论】:

感谢您的回答。我很可能会为此使用 Kafka 流。【参考方案2】:

如果您正在实施自定义 SMT,您可以简单地检查传入记录的主题,并针对您不希望应用转换逻辑的主题返回未更改的记录。

【讨论】:

是的,这是实现自定义 SMT 的方式。我在问是否有办法在不编写自己的 SMT 的情况下做到这一点。最终我决定使用 KSQL 来完成这项任务。

以上是关于是否可以仅将 SMT(单消息转换)应用于来自指定主题的消息的主要内容,如果未能解决你的问题,请参考以下文章

如何仅将 CSS 过渡应用于 transform 属性

使 ESLint 仅将规则应用于某些文件名模式

我可以仅将样式应用于我的应用程序组件吗?

CSS:仅将指针事件应用于文本

Wordpress:如何仅将 widget_title 过滤器应用于某个侧边栏中的小部件?

Spark 是不是仅将我的 UDF 应用于正在显示的记录?