ApsaraMQ for RocketMQ utiliza offsets de consumidor para gerenciar o progresso de consumo. Este tópico descreve o mecanismo de gerenciamento de progresso de consumo do ApsaraMQ for RocketMQ.
Informações básicas
No ApsaraMQ for RocketMQ, as mensagens podem ser geradas antes ou depois da inscrição pelos consumidores. Como o consumidor sabe onde começar a consumir mensagens e como marcar as mensagens já consumidas? Para resolver esse desafio, o ApsaraMQ for RocketMQ desenvolveu o mecanismo de gerenciamento de progresso de consumo.
O mecanismo de gerenciamento de progresso de consumo do ApsaraMQ for RocketMQ resolve os seguintes problemas:
Onde o cliente começa a consumir mensagens após a inicialização?
Como marcar uma mensagem consumida para garantir que não seja processada várias vezes?
O mesmo cliente pode consumir novamente uma mensagem se ocorrer uma exceção de serviço?
Mecanismo de funcionamento
Offset
No ApsaraMQ for RocketMQ, as mensagens são armazenadas em múltiplas filas de um tópico específico, na ordem em que chegam ao broker. Cada mensagem recebe uma coordenada única do tipo Long, também conhecida como offset da mensagem.
Teoricamente, uma fila de mensagens pode armazenar uma quantidade indefinida de mensagens. Portanto, o intervalo de valores do offset varia de 0 a Long.MAX_VALUE. É possível localizar uma mensagem com base no tópico, na fila e no offset. A figura a seguir mostra a relação entre esses conceitos.
No ApsaraMQ for RocketMQ, o offset da mensagem mais antiga em uma fila é chamado de offset mínimo (MinOffset), e o offset da mensagem mais recente é chamado de offset máximo (MaxOffset). Embora uma fila de mensagens possa teoricamente conter uma quantidade indefinida de mensagens, as máquinas físicas onde elas são armazenadas têm espaço limitado. Por isso, o ApsaraMQ for RocketMQ exclui dinamicamente a mensagem armazenada mais antiga de uma fila, e os valores de MinOffset e MaxOffset da fila aumentam constantemente.
Offset do consumidor
O ApsaraMQ for RocketMQ segue o padrão de publicação-assinatura. Vários grupos de consumidores podem assinar a mesma fila. Nesse cenário, quando um consumidor exclui uma mensagem após consumi-la, outros consumidores não conseguem acessar essa mensagem.
Para evitar isso, o ApsaraMQ for RocketMQ usa offsets de consumidor para gerenciar o progresso de consumo de diferentes consumidores. O ApsaraMQ for RocketMQ não exclui uma mensagem imediatamente após o consumo. Em vez disso, mantém um registro da última mensagem consumida por um grupo de consumidores, denominado offset do consumidor.
Se o cliente for reiniciado, o consumidor continuará processando mensagens com base no offset do consumidor salvo no broker. Caso o offset do consumidor expire e seja excluído, o valor de MinOffset da fila salvo no broker será usado como offset do consumidor.
Os offsets de consumidor são salvos e restaurados pelos brokers do ApsaraMQ for RocketMQ e não estão vinculados a um consumidor específico. Portanto, o ApsaraMQ for RocketMQ pode restaurar o progresso de consumo entre diferentes consumidores.
A figura a seguir mostra as relações entre o offset mínimo, o offset máximo e o offset do consumidor em uma fila de mensagens.
-
O offset do consumidor é sempre menor ou igual ao offset máximo.
Se a produção e o consumo de mensagens ocorrerem na mesma taxa e não houver mensagens pendentes na fila, o offset do consumidor será igual ao offset máximo.
Se o consumo for mais lento que a produção, haverá mensagens pendentes na fila. Nesse caso, o offset do consumidor será menor que o offset máximo, e a diferença corresponderá ao número de mensagens não consumidas.
Normalmente, o offset do consumidor é maior ou igual ao offset mínimo. Se for menor, o consumidor não conseguirá consumir mensagens. Nessa situação, o broker restaura o offset correto para o consumidor.
Offset inicial do consumidor
O offset inicial do consumidor é o offset salvo no broker quando um grupo de consumidores começa a consumir uma fila de mensagens pela primeira vez.
O ApsaraMQ for RocketMQ usa o offset máximo da fila no momento em que o consumidor obtém mensagens pela primeira vez como offset inicial. Em outras palavras, o consumidor inicia o consumo a partir da mensagem mais recente da fila.
Redefinição de offset do consumidor
Se o offset inicial ou atual do consumidor não estiver alinhado com o estado do seu negócio, redefina o offset do consumidor para ajustar o progresso de consumo.
Cenários
Offset inicial inadequado: O offset inicial do consumidor corresponde ao offset máximo da fila, e o cliente começa o consumo a partir da mensagem mais recente. Para consumir mensagens anteriores, redefina o offset do consumidor para o de uma mensagem mais antiga.
Atraso no consumo: Um grande volume de mensagens pode acumular se o consumidor não acompanhar a velocidade de geração das mensagens. Se as mensagens acumuladas não forem críticas para o negócio, defina um valor maior para o offset do consumidor a fim de ignorar essas mensagens e aliviar a carga nos sistemas downstream.
Rastreamento retroativo e processamento corretivo de negócios: Para reconsumir mensagens consumidas incorretamente devido a erros de negócio, defina um valor menor para o offset do consumidor.
Recurso de redefinição de offset do consumidor
O recurso de redefinição de offset do consumidor do ApsaraMQ for RocketMQ oferece as seguintes capacidades:
-
Redefinir um offset de consumidor para o offset mais recente
Os consumidores do grupo especificado ignoram todas as mensagens acumuladas no tópico indicado e iniciam o consumo a partir do offset mais recente.
-
Redefinir um offset de consumidor para um ponto específico no tempo
Os consumidores iniciam o consumo a partir da mensagem correspondente ao ponto no tempo redefinido, independentemente de a mensagem já ter sido consumida.
Especifique um ponto no tempo dentro do intervalo que vai desde o envio da primeira mensagem ao tópico até o envio da mensagem mais recente.
Ao redefinir um offset de consumidor para um ponto específico no tempo, o broker ajusta o offset do consumidor para o offset mais próximo desse momento.
Métodos de configuração
-
Operações no console:
Faça login no console do ApsaraMQ for RocketMQ. No painel de navegação à esquerda, selecione Instances.
Na página Instances, selecione a instância desejada. No painel de navegação à esquerda da página Instance Details exibida, clique em Groups.
Na página Groups, clique em no grupo desejado. Na página Group Details exibida, redefina o offset do consumidor.
Operação de API: ResetConsumeOffset
Limites
Após a redefinição, o consumidor começa a consumir mensagens a partir do novo offset. Em cenários de rastreamento retroativo, o consumidor inicia com mensagens históricas compostas majoritariamente por dados frios. Esse processo, conhecido como leitura fria, pode causar carga excessiva no sistema. Avalie os riscos e benefícios antes de redefinir um offset de consumidor. Recomendamos implementar políticas rigorosas de controle para essa permissão a fim de evitar abusos e redefinições frequentes.
O ApsaraMQ for RocketMQ permite redefinir o offset do consumidor apenas para mensagens visíveis. Não é possível redefinir o offset de mensagens nos estados de agendamento ou pendentes de nova tentativa. Para mais informações, consulte Mensagens agendadas e atrasadas e Nova tentativa de consumo.
Compatibilidade de versões
Os brokers possuem definições diferentes para o offset inicial do consumidor nas diversas versões do ApsaraMQ for RocketMQ:
Nas versões 4.x e 3.x, o offset inicial do consumidor é definido como o status da mensagem de uma fila.
Nas versões 5.x, o offset inicial do consumidor corresponde ao offset máximo da fila no momento em que o consumidor começa a receber mensagens.
Portanto, ao atualizar de uma versão anterior, preste atenção ao offset inicial do consumidor ao iniciar o cliente.
Observações de uso
Controle rigoroso das permissões de redefinição
A redefinição do offset do consumidor gera carga adicional no sistema e pode afetar a leitura e a gravação de mensagens. Por isso, recomendamos avaliar os riscos e benefícios antes de executar essa operação.