O acúmulo de mensagens corresponde à diferença entre o offset mais recente e o offset de consumo confirmado de um Grupo. Esse valor indica o atraso do consumidor. Ao verificar o status de consumo de um Grupo, o acúmulo de mensagens pode apresentar 0 ou aparecer vazio, mesmo quando o offset de consumo não coincide com o offset mais recente. Geralmente, isso sinaliza um problema na confirmação ou no armazenamento dos offsets de consumo.
A tabela a seguir resume as possíveis causas e as correções rápidas.
|
Causa |
Sintoma |
Correção |
|
Offset de consumo não confirmado ou expirado |
A coluna de offset de consumo está vazia para todas as partições |
Ative a confirmação automática ou adicione chamadas de confirmação manual; reinicie consumidores ociosos |
|
Offset de consumo redefinido manualmente para 0 |
Uma partição exibe offset de consumo 0 enquanto o offset mais recente é muito maior |
Permita que o consumidor retome e confirme os offsets atualizados |
|
Offset de consumo igual ao offset mais recente |
O offset de consumo coincide com o offset mais recente em todas as partições |
Nenhuma ação necessária — este é o comportamento normal |
Possíveis causas
Offset de consumo não confirmado ou expirado
Esta é a causa mais frequente. O sistema calcula o acúmulo de mensagens como a diferença entre o offset mais recente e o offset de consumo. Se não existir nenhum offset de consumo, o sistema não consegue calcular esse valor e exibe 0 ou deixa o campo vazio.
Isso ocorre em dois cenários:
O consumidor nunca confirmou um offset. Se
enable.auto.commitestiver definido comofalsee nenhuma chamada de confirmação manual (commitSync()oucommitAsync()) for executada, nenhum offset de consumo será armazenado. Sem um offset base, o sistema não consegue calcular o acúmulo de mensagens. Por padrão,enable.auto.commitétrue, e os offsets são confirmados automaticamente no intervalo especificado porauto.commit.interval.ms(padrão: 5 segundos). Caso tenha desativado a confirmação automática, confirme os offsets explicitamente no código do consumidor.O offset de consumo expirou. Os offsets de consumo são retidos por um período limitado, controlado pela configuração do broker
offsets.retention.minutes. Se um Grupo parar de consumir e o período de retenção terminar, os offsets armazenados serão excluídos. Quando os offsets expiram, os dados do grupo de consumidores são limpos e o atraso não pode ser calculado.
Como verifique:
No console do ApsaraMQ for Kafka, acesse Groups e verifique se o Grupo possui algum offset de consumo confirmado.
Se a coluna de offset de consumo estiver vazia para todas as partições, os offsets nunca foram confirmados ou já expiraram.
Também é possível usar a ferramenta CLI kafka-consumer-groups para inspecionar o Grupo. A saída será semelhante à seguinte:
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
my-topic 0 - 4 - consumer-1-... /127.0.0.1 consumer-1
my-topic 1 - 3 - consumer-1-... /127.0.0.1 consumer-1
Um - nas colunas CURRENT-OFFSET e LAG indica que nenhum offset de consumo foi confirmado para essa partição.
Como corrigir:
Se a confirmação automática estiver desativada, adicione confirmações explícitas de offset ao código do consumidor ou defina
enable.auto.commitcomotrue.Caso os offsets tenham expirado porque o consumidor ficou ocioso por muito tempo, reinicie o consumidor. Novos offsets serão confirmados assim que ele começar a processar mensagens.
Offset de consumo redefinido manualmente para 0
Se você redefinir manualmente o offset de consumo de uma partição para 0, o valor de acúmulo de mensagens poderá ser exibido incorretamente. Após uma redefinição, o sistema recalcula o acúmulo de mensagens com base no novo offset. Dependendo do momento e do estado do consumidor, o valor exibido pode mostrar temporariamente 0 ou aparecer vazio antes que o consumidor retome e confirme os offsets atualizados.
Como verifique:
Verifique o offset de consumo de cada partição no status de consumo do Grupo. Se alguma partição apresentar offset de consumo 0 enquanto o offset mais recente for muito maior, é provável que tenha ocorrido uma redefinição manual. A saída da CLI será semelhante à seguinte:
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
my-topic 0 0 15000 15000 consumer-1-... /127.0.0.1 consumer-1
Um CURRENT-OFFSET igual a 0 com um LOG-END-OFFSET grande indica uma redefinição recente de offset.
Como corrigir:
Permita que o consumidor retome o processamento. À medida que o consumidor confirma os offsets atualizados, o valor de acúmulo de mensagens se corrige automaticamente.
Offset de consumo igual ao offset mais recente
Este é o comportamento esperado. Quando o offset de consumo coincide com o offset mais recente, o acúmulo de mensagens é 0 porque o consumidor processou todas as mensagens produzidas.
Como verifique:
Compare o offset de consumo e o offset mais recente de cada partição. Se eles coincidirem em todas as partições, o Grupo está totalmente sincronizado e 0 é o valor correto. A saída da CLI será semelhante à seguinte:
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
my-topic 0 150 150 0 consumer-1-... /127.0.0.1 consumer-1
my-topic 1 200 200 0 consumer-2-... /127.0.0.1 consumer-2
Essa causa explica apenas um acúmulo de mensagens igual a 0. Ela não justifica um valor vazio ou ausente.
Referência de diagnóstico
Estados do Grupo de Consumidores
Ao solucionar problemas de acúmulo de mensagens, verifique o estado do Grupo de consumidores. O estado determina se os dados de atraso estão disponíveis.
|
Estado |
Descrição |
Efeito na exibição do acúmulo de mensagens |
|
Stable |
Consumidores ativos com partições atribuídas |
Exibido normalmente |
|
Empty |
Nenhum consumidor ativo no Grupo |
Pode exibir 0 ou vazio se os offsets tiverem expirado |
|
Dead |
O Grupo não tem membros nem offsets confirmados |
Não exibido |
|
Rebalancing |
Partições sendo reatribuídas entre consumidores |
Os valores podem estar desatualizados ou congelados até a conclusão do rebalanceamento |
Parâmetros de configuração relacionados
|
Parâmetro |
Padrão |
Descrição |
|
|
|
Ativa a confirmação automática de offsets em intervalos regulares |
|
|
|
Intervalo entre confirmações automáticas de offsets (em milissegundos) |
|
|
Varia conforme a implantação |
Duração pela qual os offsets confirmados são retidos após o Grupo de consumidores ficar vazio |
|
|
|
Defina o comportamento do consumidor quando não existe offset confirmado: |