如何在不花费太多费用的情况下动态添加钩子?



假设我有一个这样的processElement函数:

class InputProcessor {
public void processElement(T element) {
nextOperator.processElement(element);
}
}

现在我想添加一个开/关开关来计算"开关开启"期间的元素。但是,我不想添加这样的"if else",因为它可能会降低性能。

class InputProcessor {
public void processElement(T element) {
if (on) {
count++;
}
nextOperator.processElement(element);
}
}

有什么方法可以帮助实现这一点吗?我有一个想法,但我不确定它是否按预期工作(没有性能下降(。我将创建一个CountInputProcessor,就像InputProcessor一样,除了计数部分。

class CountInputProcessor {
public void processElement(T element) {
count++;
nextOperator.processElement(element);
}
}

当我打开该功能时,我重新定义了运算符(InputProcessor是无状态的(。

inputProcessor = new CountInputProcessor();
inputProcessor.processElement(element);

当我关闭该功能时,我将其重新定义为旧InputProcessor

我不会担心性能下降。 只需确保拓扑正确运行,如果它没有像您想要的那样扩展,请执行通常的调优操作,例如增加运算符的并行性。

由于 JVM 的分支预测,此交换机的性能下降将微不足道。我建议在相关的stackoverflow帖子中阅读有关分支预测的影响。由于切换将大部分关闭,JVM 将推测性地执行正确的代码路径。

如果您确实想采用建议的路线,您还可以根据标志创建不同的拓扑,并使用带有保存点的停止并重新启动以在它们之间切换。当然,您需要确保运算符使用相同的 UID,以便状态恢复按预期工作。

相关内容

  • 没有找到相关文章

最新更新