シーケンスメッセージの再試行
シーケンシャルメッセージの場合、コンシューマーがメッセージの消費に失敗すると、メッセージキューRocketMQは自動的にメッセージを継続的に再試行します(各時間間隔は1秒です)。このとき、アプリケーションはメッセージの消費をブロックします。したがって、シーケンシャルメッセージを使用する場合は、ブロッキングを回避するために、アプリケーションが消費の失敗を時間内に監視および処理できることを確認する必要があります。
順不同のメッセージの再試行
順不同のメッセージ(通常、時間指定、遅延、トランザクションメッセージ)の場合、コンシューマーがメッセージの消費に失敗したときに、メッセージの再試行の結果を達成するために戻りステータスを設定できます。
順不同のメッセージの再試行は、クラスター消費モードでのみ有効です。ブロードキャストモードでは、失敗の再試行機能は提供されません。つまり、消費が失敗した後、失敗したメッセージは再試行されず、新しいメッセージが続行されます。消費されます。
再試行回数
メッセージキューRocketMQでは、デフォルトで各メッセージを最大16回再試行できます。各再試行の間隔は、次のとおりです。
初めて再試行する | 最後の再試行間の時間 | 初めて再試行する | 最後の再試行間の時間 |
---|---|---|---|
1 | 10秒 | 9 | 7分 |
2 | 30秒 | 10 | 8分 |
3 | 1分 | 11 | 9分 |
4 | 2分 | 12 | 10分 |
5 | 3分 | 13 | 20分 |
6 | 4分 | 14 | 30分 |
7 | 5分 | 15 | 1時間 |
8 | 6分 | 16 | 2時間 |
16回再試行してもメッセージが失敗する場合、メッセージは配信されなくなります。上記の再試行間隔に厳密に従って計算された場合、メッセージは、消費が失敗したことを前提として、次の4時間46分で16回再試行されます。この時間範囲を過ぎると、メッセージは配信のために再試行されません。
注:メッセージが何度再試行されても、これらの再試行メッセージのメッセージIDは変更されません。
構成方法
消費が失敗した後、構成モードを再試行します。
クラスター消費モードでは、メッセージの消費が失敗した後にメッセージが再試行されることが期待されます。メッセージリスナーインターフェイスの実装で明示的に構成する必要があります(3つの方法のいずれかを選択してください) )::
- アクションに戻るReconsumeLater(推奨)
- Nullを返す
- 例外をスローする
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");
}
}
コンシューマーが失敗した後は、構成モードを再試行しないでください。
クラスターコンシューマーモードでは、メッセージが失敗した後、メッセージは再試行されないことが期待されます。コンシューマーロジックでスローされる可能性のある例外をキャプチャし、最後に戻る必要があります。 Action.CommitMessageへ。このメッセージは後で再試行されません。
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;
}
}
メッセージの最大再試行回数をカスタマイズするRocketMQメッセージキューでは、コンシューマーの起動時に最大再試行回数を設定できます。再試行間隔は、次の戦略に従います。
- 再試行の最大回数は16回以下であり、再試行間隔は上記の表に記載されているものと同じです。
- 再試行の最大回数は16回を超え、16回を超える再試行間隔は毎回2時間です。
Properties properties = new Properties();
//配置对应 Group ID 的最大消息重试次数为 20 次
properties.put(PropertyKeyConst.MaxReconsumeTimes,"20");
Consumer consumer =ONSFactory.createConsumer(properties);
注意:
- メッセージの再試行の最大数の設定は、同じグループIDの下にあるすべてのコンシューマーインスタンスに対して有効です。
- MaxReconsumeTimesが同じグループIDの2つのコンシューマーインスタンスのうちの1つにのみ設定されている場合、構成は両方のコンシューマーインスタンスに対して有効になります。
- 構成は上書きによって有効になります。つまり、最後に開始されたコンシューマーインスタンスは、前のスタートアップインスタンスの構成を上書きします。
メッセージの再試行回数
を取得するメッセージを受信した後、コンシューマーは次のようにメッセージの再試行回数を取得できます。
public class MessageListenerImpl implements MessageListener {
@Override
public Action consume(Message message, ConsumeContext context) {
//获取消息的重试次数
System.out.println(message.getReconsumeTimes());
return Action.CommitMessage;
}
}