防止卡夫卡消费者中的级联故障

Prevent cascading failures in Kafka consumers

假设您有一个包含 3 个成员(M1、M2 和 M3)的 Kafka 消费者组。每个成员 运行 在其自己的进程中,并且每个成员当前都分配了一个分区(Pa、Pb 和 Pc)。

M1 收到来自 P1 的毒消息,该消息经过精心设计,会触发堆栈溢出异常,从而杀死 M1。这最终会触发再平衡,M2 现在有 P1。

M2 现在将从 P1 收到相同的毒信息 - 并且也会死亡,触发重新平衡并将 P1 交给 M3。

最后M3也会收到同样的消息而死

此时你已经取出了整套处理器——你启动的任何新处理器也会死掉,直到你直接在 Kafka 中修复消息。

我的问题是 - 如何防止这种级联故障?我很高兴受影响的分区在问题得到解决之前被忽略,并且我可以看到在处理异常的情况下我将如何使用暂停功能来实现这一点。但是,我无法处理堆栈溢出,因此无法轻松暂停分区。

Kafka有没有处理这种级联故障的机制?

不要刻薄,但我推测防止堆栈溢出破坏进程的最佳方法是防止堆栈溢出。其他任何东西基本上都是创可贴。

如果有足够的消息,几乎可以保证在一个消费者上遇到的任何异常(包括堆栈溢出)都会在该消费者的所有其他实例中遇到。

考虑到这一点,并且处理堆栈溢出异常的软件手段有限,我可以明智地推荐的唯一途径是在这些异常发生之前先发制人。

如果在某些情况下您无法阻止这些异常,那么更多信息可能有助于我们给出更详细的答案。

关于 Apache Kafka 的最佳问题之一。

那么我们可以使用 assign(Collection partitions) 方法来避免这种情况。在这种特殊情况下,我们可以执行以下操作:

M1

    Consumer<K, V> m1 = getConsumer();
    TopicPartition tp = new TopicPartition("topic", 0);
    m1.assign(Arrays.asList(tp));

M2

    Consumer<K, V> m2 = getConsumer();
    TopicPartition tp = new TopicPartition("topic", 1);
    m2.assign(Arrays.asList(tp));

M3

    Consumer<K, V> m3 = getConsumer();
    TopicPartition tp = new TopicPartition("topic", 2);
    m3.assign(Arrays.asList(tp));

注意:以上代码只是一个例子

你可以找到详细的解释here

如果您需要任何进一步的帮助,请告诉我。乐于助人。