消费者宕机
解决方法:消费者取消自动Ack,改为手动Ack消息
image
image
image
中间件宕机
解决方法:定位queue为持久化,同时发送的每条消息设置为持久化
channel.queueDeclare(
"warehouse_schedule_delivery",
true, //queue是否为持久化
false,
false,
null);
channel.basicPublish(
"",
"warehouse_schedule_delivery",
MessageProperties.PERSISTENT_TEXT_PLAIN,//设置持久化
message.getBytes());
image
消费者消息积压
通过 “channel.basicQos(10)” 这个方法来设置当前 channel 的 prefetch count。
RabbitMQ 官方给出的建议是 prefetch count 一般设置在 100~300 之间。
消费者处理异常
try{
//正常完成,手动确认消息
channel.basicAck(
delivery.getEnvelope().getDeliveryTag(),
true);
}catch(Exception e){
//出现异常,回复消息未完成
channel.basicNack(
delivery.getEnvelope().getDeliveryTag(),
true);
}
image
生产者投递确认
imageconfirm 机制投递消息是高延迟的,因此有以下要求:
- 用来临时存放未 ack 消息的存储需要承载高并发写入,如 kv 存储
- 投递消息之后等待 ack 的过程必须是异步的,通过异步回调完成ack、nack以及超时的处理
参考资料
https://juejin.im/post/5c190f02518825046c2f6a5c MQ收发实例和异常处理
https://juejin.im/post/5c1e51fd6fb9a049a81f4f35 MQ持久化
https://juejin.im/post/5c3604abe51d45522a41f4b0 方案考虑
https://juejin.im/post/5c3b392e518825255d296f78 消费者吞吐量
https://juejin.im/post/5c3759fe51882525616dbaf6 消费者ack机制
https://juejin.im/post/5c3c9fb3f265da61461e625b 生产者confirm机制
网友评论