Error handling 使用Kafka'处理不良消息;s流API

Error handling 使用Kafka'处理不良消息;s流API,error-handling,apache-kafka,apache-kafka-streams,Error Handling,Apache Kafka,Apache Kafka Streams,我有一个基本的流处理流程 master topic -> my processing in a mapper/filter -> output topics 我想知道处理“坏消息”的最佳方法。这可能是诸如我无法正确反序列化的消息之类的事情,或者可能是处理/筛选逻辑以某种意外的方式失败(我没有外部依赖项,因此不应该有这种类型的暂时错误) 我正在考虑将我所有的处理/过滤代码包装在一个try-catch中,如果出现异常,则路由到一个“错误主题”。然后我可以研究消息并修改它,或者根据需要修

我有一个基本的流处理流程

master topic -> my processing in a mapper/filter -> output topics
我想知道处理“坏消息”的最佳方法。这可能是诸如我无法正确反序列化的消息之类的事情,或者可能是处理/筛选逻辑以某种意外的方式失败(我没有外部依赖项,因此不应该有这种类型的暂时错误)

我正在考虑将我所有的处理/过滤代码包装在一个try-catch中,如果出现异常,则路由到一个“错误主题”。然后我可以研究消息并修改它,或者根据需要修复代码,然后将其重播到master。如果我让任何异常传播,流似乎会被阻塞,不再拾取任何消息

  • 这种方法被认为是最佳实践吗
  • 有没有一种方便的卡夫卡流处理方法?我认为没有DLQ的概念
  • 有哪些替代方法可以阻止卡夫卡干扰“坏消息”
  • 有哪些其他错误处理方法
为了完整起见,这里是我的代码(伪ish):

类文档{
//田地
}
类分析文档{
文件;
字符串值;
例外情况;
分析;
//一切都好
分析文档(文档文档,分析分析){…}
//分析失败
分析文档(文档文档,异常){…}
//反序列化失败
AnalysedDocument(字符串值,异常){…}
}
KStreamBuilder builder=新的KStreamBuilder();
KStream analysedDocumentStream=builder
.stream(Serdes.String()、Serdes.String()、“master”)
.mapValues(新的ValueMapper(){
@凌驾
公共分析文档应用(字符串值){
文件;
试一试{
//反序列化
文件=。。。
}捕获(例外e){
返回新的分析文档(原始值,异常);
}
试一试{
//进行分析
分析=。。。
返回新的分析文件(文件、分析);
}捕获(例外e){
返回新的分析文件(文件,例外);
}
}
});
//基于分析映射是否未能生成errorStream和successStream的分支
errorStream.to(Serdes.String(),customPojoSerde(),“error”);
successStream.to(Serdes.String(),customPojoSerde(),“已分析”);
KafkaStreams streams=新的KafkaStreams(生成器,配置);
streams.start();

非常感谢您的帮助。

目前,Kafka Streams仅提供有限的错误处理功能。简化这一点的工作正在进行中。就目前而言,您的总体方法似乎是一个不错的选择

关于处理反序列化错误的一条注释:手动处理这些错误需要“手动”执行反序列化。这意味着,您需要为Streams应用程序的输入/输出主题的键和值配置
ByteArraySorde
s,并添加一个执行反序列化/序列化的
map()
(即,
KStream->map()->KStream
——或者如果您还想捕获序列化异常,则使用另一种方法)。否则,您无法
尝试捕获
反序列化异常

使用当前方法,“仅”验证给定字符串是否表示有效文档——但可能是这样的,消息本身已损坏,无法首先在源操作符中将其转换为
字符串。因此,您的代码实际上并不包含反序列化异常。然而,如果您确信反序列化异常永远不会发生,那么您的方法也就足够了

更新

此问题将通过解决,并将包含在下一版本1.0.0中。它允许您通过参数
default.deserialization.exception.handler
注册回调。在反序列化过程中每次出现异常时都会调用处理程序,并允许您返回
反序列化响应
继续
->删除记录继续移动,或
失败
,这是默认设置)

更新2

使用(将成为Kafka 1.1中的一部分),还可以通过配置
default.production.exception.handler
注册
ProductionExceptionHandler
来处理生产者端的错误,类似于消费者端,该配置可返回
CONTINUE
更新日期:3月23日,2018:Kafka 1.0通过提供比我下面描述的更好、更简单的错误消息(“毒药”)处理。请参见卡夫卡1.0文档中的

这可能是我无法正确反序列化的消息之类的东西[…]

好的,我的回答集中在(反)序列化问题上,因为对于大多数用户来说,这可能是最棘手的场景

[…]或者处理/过滤逻辑以某种意外的方式失败(我没有外部依赖关系,因此不应该有这种暂时性错误)

同样的思想(对于反序列化)也可以应用于处理逻辑中的故障。在这里,大多数人倾向于下面的选项2(减去反序列化部分),但是YMMV

我正在考虑将我所有的处理/过滤代码包装在一个try-catch中,如果出现异常,则路由到一个“错误主题”。然后我可以研究消息并修改它,或者根据需要修复代码,然后将其重播到master。如果我让任何异常传播,流似乎会被阻塞,不再拾取任何消息

  • 这种方法被认为是最佳实践吗
是的,目前这是一条路要走。本质上,两种最常见的模式是(1)跳过c