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;
}
}