我有一个flink工作,涉及Kafaka主题,并经过许多运营商。我想知道处理中间发生的异常的最佳方法是什么。
我的目标是拥有一个集中的位置来处理可能由不同操作员抛出的异常,这是我当前的解决方案:
使用ProcessFunction
并将sideOutput
输出到catch块中的context
(假设存在异常),并在结尾处为sideOutput
提供单独的接收器功能,其中它调用外部服务来更新另一个相关作业的状态
但是,我的问题是,这样做似乎仍然需要调用collector.collect()
并传递一个空值,以便继续进行以下运算符并进入sideOutput
将流入的最后阶段单独的接收器功能。这是正确的方法吗?
我也不确定如果不在运算符内部调用collector.collect()
会发生什么实际情况,它会挂在那里并导致内存泄漏吗?
答案 0 :(得分:2)
最好不要打{{1}}。而且,当您使用侧面输出捕获异常时,您无需使用空值调用collector.collect()
-每个运算符都可以拥有自己的侧面输出。最后,如果您有多个此类运算符,并且带有用于异常的副输出,则可以collect()
将副输出一起union()
,然后将该流发送到接收器。
如果出于某种原因下游操作员需要知道存在异常,那么一种方法是输出Either<good result, Exception>
,但是每个下游操作员当然都需要有代码来检查什么它正在接收。