As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Solução de problemas de consumidores do Kinesis Data Streams
As seções a seguir oferecem soluções para alguns problemas comuns que você pode encontrar ao trabalhar com consumidores do Amazon Kinesis Data Streams.
- Alguns registros do Kinesis Data Streams são ignorados ao usar a Kinesis Client Library
- Registros pertencentes ao mesmo estilhaço são processados por processadores de registros diferentes ao mesmo tempo
- Aplicativo consumidor está lendo a uma taxa menor que a esperada
- GetRecords Retorna uma matriz de registros vazia mesmo quando há dados no fluxo
- Iterador do estilhaço expira inesperadamente
- Processamento de registros de consumidores ficando atrasados
- Erro de permissão de chave mestra do KMS não autorizada
- Problemas, perguntas e ideias de solução de problemas comuns para consumidores
Alguns registros do Kinesis Data Streams são ignorados ao usar a Kinesis Client Library
A causa mais comum de registros ignorados é uma exceção não processada lançada de processRecords
. A Kinesis Client Library (KCL) dependeprocessRecords
do seu código para lidar com quaisquer exceções decorrentes do processamento dos registros de dados. Qualquer exceção retiradaprocessRecords
é absorvida pela KCL. Para evitar repetições infinitas em uma falha recorrente, o KCL não reenvia o lote de registros processados no momento da exceção. Em seguida, o KCLprocessRecords
solicita o próximo lote de registros de dados sem reiniciar o processador de registros. Isso resulta efetivamente em aplicativos consumidores observando registros ignorados. Para impedir registros ignorados, processe todas as exceções em processRecords
da forma apropriada.
Registros pertencentes ao mesmo estilhaço são processados por processadores de registros diferentes ao mesmo tempo
Para qualquer aplicativo Kinesis Client Library (KCL) em execução, um fragmento tem apenas um proprietário. No entanto, vários processadores de registro pode temporariamente processar o mesmo estilhaço. No caso de uma instância de trabalho que perde a conectividade de rede, a KCL presume que o trabalhador inacessível não está mais processando registros, após o término do tempo de failover, e orienta outras instâncias de trabalho a assumirem o controle. Por um breve período, novos processadores de registros e processadores de registros provenientes do operador inacessível podem processar dados do mesmo estilhaço.
Você deve definir um tempo de failover que seja apropriado para seu aplicativo. Para aplicativos de baixa latência, o padrão de 10 segundos pode representar o tempo máximo que você deseja esperar. No entanto, nos casos em que você espera problemas de conectividade, como fazer chamadas em áreas geográficas em que a conectividade pode ser perdida com mais frequência, esse número pode ser muito baixo.
O aplicativo deve prever e lidar com esse cenário, especialmente porque a conectividade de rede normalmente é restaurada para o operador anteriormente inacessível. Se um processador de registros tem seus estilhaços executados por outro processador de registros, ele deve lidar com os dois casos seguintes para executar o encerramento normal:
-
Depois que a chamada atual
processRecords
for concluída, o KCL invoca o método de desligamento no processador de gravação com o motivo de desligamento 'ZOMBIE'. Espera-se que seus processadores de registros limpem quaisquer recursos conforme apropriado e, em seguida, saiam. -
Quando você tenta controlar um trabalhador “zumbi”, o KCL lança
ShutdownException
. Depois de receber essa exceção, seu código deve sair do método atual de forma limpa.
Para obter mais informações, consulteTratar registros duplicados
Aplicativo consumidor está lendo a uma taxa menor que a esperada
Os motivos mais comuns para a taxa de transferência de leitura ser mais lenta do que o esperado são os seguintes:
-
Vários aplicativos consumidores com um total de leituras que excedem os limites por estilhaço. Para obter mais informações, consulteCotas e limites Nesse caso, aumente o número de fragmentos no fluxo de dados do Kinesis.
-
O limite que especifica o número máximo de GetRecords por chamada pode ter sido configurado com um valor baixo. Se você estiver usando a KCL, poderá configurar o operador com um valor baixo para a propriedade
maxRecords
. Em geral, recomendamos o uso dos padrões do sistema para essa propriedade. -
A lógica em sua chamada
processRecords
está demorando mais do que o esperado por várias razões possíveis. A lógica pode usar muitos recursos da CPU, bloquear a E/S ou estar afunilada na sincronização. Para testar se isso é verdadeiro, teste a execução de processadores de registros vazios e comparar a taxa de transferência de leitura. Para obter informações sobre como acompanhar os dados de entrada, consulte Reestilhaçamento, escalabilidade e processamento paralelo.
Se você tem apenas um aplicativo consumidor, sempre é possível ler pelo menos duas vezes mais rápido do que a taxa de colocação. Isso porque é possível escrever até 1.000 registros por segundo para gravações, até um número máximo de gravações de 1 MB de dados por segundo (incluindo chaves de partição). Cada fragmento aberto pode suportar até 5 transações por segundo para leituras, até uma taxa máxima total de leitura de dados de 2 MB por segundo. Observe que cada leitura (chamada a GetRecords) obtém um lote de registros. O tamanho dos dados retornados pelo GetRecords varia de acordo com a utilização do estilhaço. O tamanho máximo dos dados queGetRecords podem retornar é de 10 MB. Se uma chamada retorna esse limite, as chamadas subsequentes feitas nos próximos 5 segundos lançam ProvisionedThroughputExceededException
.
GetRecords Retorna uma matriz de registros vazia mesmo quando há dados no fluxo
O consumo, ou a obtenção, de registros é um modelo de envio. Espera-se que os desenvolvedores GetRecordsliguem em um ciclo contínuo sem recuos. Cada chamada a GetRecords também retorna um valor de ShardIterator
que deve ser usado na próxima iteração do loop.
A operação GetRecords não bloqueia. Em vez disso, ela retorna imediatamente; com registros de dados relevantes ou com um elemento Records
vazio. Um elemento Records
vazio é retornado em duas condições:
-
Atualmente, não há mais dados no estilhaço.
-
Não há dados perto da parte do estilhaço indicada pelo
ShardIterator
.
A última condição é sutil, mas é uma característica de compensação necessária para evitar tempo de busca ilimitado (latência) ao recuperar registros. Desse modo, o aplicativo de consumo de streaming deve fazer um loop e chamar GetRecords tratando os registros vazios como de costume.
Em um cenário de produção, o único momento em que o loop contínuo deve ser encerrado é quando o valor de NextShardIterator
é NULL
. Quando NextShardIterator
é NULL
, significa que o estilhaço foi fechado e o valor de ShardIterator
apontaria para além do último registro. Se o aplicativo consumidor nunca chamar SplitShard ou MergeShards, o estilhaço permanecerá aberto e as chamadas a GetRecords nunca retornarão um valor de NextShardIterator
que seja NULL
.
Se você usa a Kinesis Client Library (KCL), o padrão de consumo acima é resumido para você. Isso inclui a manipulação automática de um conjunto de estilhaços que mudam dinamicamente. Com o KCL, o desenvolvedor fornece apenas a lógica para processar os registros recebidos. Isso é possível porque a biblioteca faz chamadas contínuas a GetRecords para você.
Iterador do estilhaço expira inesperadamente
Um novo iterador de estilhaço é retornado por toda solicitação a GetRecords (como NextShardIterator
), que você usa na próxima solicitação GetRecords (como ShardIterator
). Normalmente, esse iterador do estilhaço não expira antes de você usá-lo. No entanto, você pode descobrir que iteradores de estilhaço expiram porque você não chamou GetRecords por mais de cinco minutos, ou porque você executou uma reinicialização do seu aplicativo consumidor.
Se o iterador de fragmentos expirar imediatamente, antes que você possa usá-lo, isso pode indicar que a tabela do DynamoDB usada pelo Kinesis não tem capacidade suficiente para armazenar os dados da concessão. Essa situação tem maior probabilidade de ocorrer se você tiver um grande número de estilhaços. Para solucionar esse problema, aumente a capacidade de gravação atribuída à tabela do estilhaço. Para obter mais informações, consulteUsando uma tabela de leasing para rastrear os fragmentos processados pelo aplicativo do consumidor KCL
Processamento de registros de consumidores ficando atrasados
Para a maioria dos casos de uso, os aplicativos consumidores estão lendo os últimos dados do stream. Em determinadas circunstâncias, as leituras dos consumidores podem ficar atrasadas, o que pode não ser desejado. Depois de identificar a dimensão do atraso da leitura dos consumidores, veja os motivos mais comuns disso ocorrer.
Comece com a métrica GetRecords.IteratorAgeMilliseconds
, que rastreia a posição de leitura em todos os estilhaços e consumidores no stream. Observe que, se a idade de um iterador ultrapassar 50% do período de retenção (por padrão, 24 horas, configurável por até 365 dias), há risco de perda de dados devido à expiração do registro. Uma solução provisória rápida é aumentar o período de retenção. Isso interrompe a perda de dados importantes enquanto você soluciona o problema. Para obter mais informações, consulteMonitorar o Amazon Kinesis Data Streams Service com o Amazon CloudWatch Em seguida, identifique até que ponto seu aplicativo consumidor está lendo cada fragmento usando uma CloudWatch métrica personalizada emitida pela Kinesis Client Library (KCL),MillisBehindLatest
. Para obter mais informações, consulteMonitorar a biblioteca de cliente Kinesis com o Amazon CloudWatch
Veja os motivos mais comuns para consumidores ficarem atrasados:
-
Grandes aumentos súbitos em
GetRecords.IteratorAgeMilliseconds
ouMillisBehindLatest
geralmente indicam um problema transitório, como falhas de operação da API para um aplicativo de downstream. Você deve investigar esses aumentos repentinos se uma das métricas exibir esse comportamento constantemente. -
Um aumento gradual nessas métricas indica que um consumidor não está acompanhando o stream porque não está processando registros com a rapidez necessária. As causas raiz mais comuns para esse comportamento são recursos físicos insuficientes ou lógica de processamento de registros que não escalou com o aumento na taxa de transmissão do stream. Você pode verificar esse comportamento examinando as outras CloudWatch métricas personalizadas que o KCL emite associadas à
processTask
operaçãoRecordProcessor.processRecords.Time
, incluindoSuccess
,RecordsProcessed
e.-
Caso veja um aumento na métrica
processRecords.Time
correlacionada ao aumento na taxa de transferência, você deve analisar a lógica do processamento de registros para identificar por que ela não está se dimensionando de acordo com a maior taxa de transferência. -
Caso veja um aumento nos valores de
processRecords.Time
que não esteja correlacionado com aumento na taxa de transferência, verifique se você está fazendo chamadas de bloqueio no caminho crítico, que muitas vezes são a causa de lentidão no processamento de registros. Uma abordagem alternativa é aumentar o paralelismo, aumentando o número de estilhaços. Finalmente, confirme se você tem uma quantidade adequada de recursos físicos (memória, utilização da CPU etc.) nos nós de processamento subjacentes durante o pico de demanda.
-
Erro de permissão de chave mestra do KMS não autorizada
Esse erro ocorre quando um aplicativo consumidor lê em um stream criptografado sem permissões na chave mestra do KMS. Para atribuir permissões a um aplicativo para acessar uma chave KMS, consulte Usando políticas de chave noAWS KMS e Usando políticas do IAM com oAWS KMS.
Problemas, perguntas e ideias de solução de problemas comuns para consumidores
-
Por que o gatilho do Kinesis Data Streams não consegue invocar minha função Lambda?
-
Como detecto e soluciono ReadProvisionedThroughputExceeded exceções no Kinesis Data Streams?
-
Por que estou enfrentando problemas de alta latência com o Kinesis Data Streams?
-
Por que meu stream de dados do Kinesis está retornando um erro interno de servidor 500?
-
Como soluciono problemas de um aplicativo KCL bloqueado ou bloqueado para o Kinesis Data Streams?