RocketMQ mensagem nova tentativa

Tentar novamente a mensagem de sequência

Para mensagens sequenciais, quando o consumidor não consegue consumir a mensagem, a fila de mensagens RocketMQ tentará automaticamente a mensagem continuamente (cada intervalo de tempo é de 1 segundo) .Neste momento, o aplicativo irá bloquear o consumo da mensagem. Portanto, ao usar mensagens sequenciais, você deve garantir que o aplicativo possa monitorar e tratar as falhas de consumo a tempo de evitar o bloqueio.

Tentar novamente mensagens fora de ordem

Para mensagens fora de ordem (mensagens normais, temporizadas, atrasadas, transacionais), quando o consumidor não consegue consumir a mensagem, você pode definir o status de retorno para obter o resultado da nova tentativa da mensagem.

A repetição de mensagens fora de ordem só tem efeito para o modo de consumo do cluster; o modo de transmissão não fornece o recurso de repetição de falha, ou seja, após o consumo falhar, a mensagem com falha não será repetida e as novas mensagens continuarão para ser consumido.

número de tentativas

A fila de mensagens RocketMQ permite que cada mensagem seja repetida até 16 vezes por padrão, e o intervalo entre cada tentativa é o seguinte:

Tente novamente pela primeira vez Tempo entre a última tentativa Tente novamente pela primeira vez Tempo entre a última tentativa
1 10 segundos 9 7 minutos
2 30 segundos 10 8 minutos
3 1 minuto 11 9 minutos
4 2 minutos 12 10 minutos
5 3 minutos 13 20 minutos
6 4 minutos 14 30 minutos
7 5 minutos 15 1 hora
8 6 minutos 16 2 horas

Se a mensagem ainda falhar após 16 tentativas, ela não será mais entregue. Se calculado estritamente de acordo com o intervalo de repetição acima, uma mensagem será repetida 16 vezes nas próximas 4 horas e 46 minutos sob a premissa de que o consumo falhou. As mensagens não serão repetidas para entrega após esse intervalo de tempo.

Observação: não importa quantas vezes uma mensagem seja tentada novamente, o ID da mensagem dessas mensagens de nova tentativa não mudará.

Método de configuração

Após a falha do consumo, tente novamente o modo de configuração. No
modo de consumo do cluster, espera-se que a mensagem seja repetida após o consumo da mensagem falhar. Ela precisa ser configurada explicitamente na implementação da interface do listener de mensagem (escolha um dos três métodos ):

  • Retorne para Action.ReconsumeLater (recomendado)
  • Return Null
  • Lançar uma exceção
public class MessageListenerImpl implements MessageListener {
    
    
    @Override
    public Action consume(Message message, ConsumeContext context) {
    
    
        //处理消息
        doConsumeMessage(message);
        //方式1:返回 Action.ReconsumeLater,消息将重试
        return Action.ReconsumeLater;
        //方式2:返回 null,消息将重试
        return null;
        //方式3:直接抛出异常, 消息将重试
        throw new RuntimeException("Consumer Message exceotion");
    }
}

Após a falha do consumo, não tente novamente o modo de configuração. No
modo de consumo do cluster, espera-se que a mensagem não seja repetida após a falha da mensagem. É necessário capturar as exceções que podem ser lançadas na lógica de consumo e, finalmente, retornar para Action.CommitMessage. Esta mensagem não será repetida posteriormente.

public class MessageListenerImpl implements MessageListener {
    
    
    @Override
    public Action consume(Message message, ConsumeContext context) {
    
    
        try {
    
    
            doConsumeMessage(message);
        } catch (Throwable e) {
    
    
            //捕获消费逻辑中的所有异常,并返回 Action.CommitMessage;
            return Action.CommitMessage;
        }
        //消息处理正常,直接返回 Action.CommitMessage;
        return Action.CommitMessage;
    }
}

Personalize o número máximo de tentativas para
mensagens A fila de mensagens RocketMQ permite que o número máximo de tentativas seja definido quando o consumidor inicia. O intervalo de repetição seguirá a seguinte estratégia:

  • O número máximo de novas tentativas é menor ou igual a 16 e o ​​intervalo de novas tentativas é o mesmo descrito na tabela acima.
  • O número máximo de novas tentativas é maior do que 16 vezes e o intervalo de novas tentativas para mais de 16 vezes é de 2 horas cada vez.
Properties properties = new Properties();
//配置对应 Group ID 的最大消息重试次数为 20 次
properties.put(PropertyKeyConst.MaxReconsumeTimes,"20");
Consumer consumer =ONSFactory.createConsumer(properties);

Nota:

  • A configuração do número máximo de novas tentativas de mensagem é válida para todas as instâncias do Consumidor sob o mesmo ID de Grupo.
  • Se MaxReconsumeTimes for definido para apenas uma das duas instâncias do Consumidor sob o mesmo ID de Grupo, a configuração terá efeito para ambas as instâncias do Consumidor.
  • A configuração entra em vigor sobrescrevendo, ou seja, a última instância do consumidor iniciada sobrescreverá a configuração da instância de inicialização anterior

Obter o número de novas tentativas de mensagem
Depois de receber a mensagem, o consumidor pode obter o número de novas tentativas de mensagem da seguinte maneira:

public class MessageListenerImpl implements MessageListener {
    
    
    @Override
    public Action consume(Message message, ConsumeContext context) {
    
    
        //获取消息的重试次数
        System.out.println(message.getReconsumeTimes());
        return Action.CommitMessage;
    }
}

Acho que você gosta

Origin blog.csdn.net/CSDN877425287/article/details/112786467
Recomendado
Clasificación