RabbitMQ
- 消息可靠性(消息至少被成功消费一次)
- 实现延迟消息投递 (延迟对列)
- 高可用(集群)
- 解决消息堆积问题(持久化)
消息可靠性
生产者消息丢失:–>生产者确认机制
- 消息未到达交换机 (成功ACK 不成功NACK)
- 消息到达交换机,未到达队列 (不成功ACK+报错)
MQ服务挂了,队列中的消息丢失 -->队列持久化( durable )
consumer接收消息但是未成功消费 -->消费者确认机制+消费者失败重试机制 (成功ACK 失败NACK)
生产者确认机制:
spring:
rabbitmq:
host: wudw.top # rabbitMQ的ip地址
port: 5672 # 端口
username: wudw
password: wdwroot
virtual-host: /
publisher-confirm-type: correlated #消息结果处理 correlated异步回调->ConfirmCallBack simple 同步等待
publisher-returns: true #定义ReturnCallback
template:
mandatory: true #true 调用ReturnCallback ,false直接丢弃消息
ReturnCallback (全局只能定义一份)
@Configuration
@Slf4j
public class CommonConfig implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
//判断是否是延迟消息 如果是延迟队列中的消息 由队列获取消息在固定时间内不放行
//所以如果是延迟队列 会报错
if (message.getMessageProperties().getReceivedDelay()>0) {
//是延迟消息 忽略错误
return;
}
log.info("消息发送到队列失败,应答码{},原因{},交换机{},路由键{},消息{}",
replyCode, replyText, exchange, routingKey, message.toString());
}
});
}
}
ConfirmCallBack(每个方法定义一份)
CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()