我正在使用从Spring的Actuator Prometheus端点输出的度量来监视Kafka偏移滞后。我注意到在某些情况下执行大型回填作业时,我的某些节点(应用程序的6个实例)将停止更新指标,直到消耗完所有消息为止。有问题的节点仍在正确处理消息(如记录和最终结果所证明)。在为我的指标绘制图形时,它在偏移滞后中显示为一条平线,直到最后一刻,当它们的线从悬崖边缘掉落时。
还有一点值得注意的是,在指标按预期进行更新并且我们已经执行了应用部署的情况下,我们可能会看到指标从按预期方式运行到一个或多个结点扁平的节点,如上所述。
在我看来,这是一种不确定的竞争条件,可能是由于我配置应用程序的方式所造成的?
我有一个使用多个主题的应用程序。除了一个主题外,所有主题都具有共享的消息格式,并且只有一个主题具有不同的格式,因为它是“重试”主题,因此消息是不同的。我还想只对常规主题应用过滤器,因此为了方便起见,我创建了两个单独的ConcurrentKafkaListenerContainerFactory
bean,例如:
@Bean
public ConcurrentKafkaListenerContainerFactory<Long, MessageA> messageAContainerFactory(
ConsumerFactory<Long, MessageA> consumerFactory) { ... }
@Bean
public ConcurrentKafkaListenerContainerFactory<Long, MessageB> messageBContainerFactory(
ConsumerFactory<Long, MessageB> consumerFactory) { ... }
然后我在相关的@KafkaListener
批注中引用这些bean:
@KafkaListener(
topics = "message-a-topic",
containerFactory = "messageAContainerFactory")
public void consumeMessageA(MessageA messageA) { ... }
@KafkaListener(
topics = "message-B-topic",
containerFactory = "messageBContainerFactory")
public void consumeMessageB(MessageB messageB) { ... }
除了这些bean,没有其他东西在玩。 Kafka的应用程序配置如下所示:
spring:
kafka:
consumer:
auto-offset-reset: latest
max-poll-records: 10
value-deserializer: org.springframework.kafka.support.serializer.ErrorHandlingDeserializer
properties:
spring:
deserializer:
value:
delegate:
class: org.springframework.kafka.support.serializer.JsonDeserializer
json:
value:
default:
type: com.example.MessageA
我要强调的是,我尚未注意到该功能的任何问题-消息似乎已按预期使用和处理。这似乎只影响指标的更新方式。
任何建议将不胜感激!