微信小程序源码网站,深圳创业贷,长沙seo搜索,如何自己编写小程序文章目录 一.消息可靠性1.生产者消息确认 MQ的一些常见问题
1.消息可靠性问题:如何确保发送的消息至少被消费一次
2.延迟消息问题:如何实现消息的延迟投递
3.高可用问题:如何避免单点的MQ故障而导致的不可用问题
4.消息堆积问题:如何解决数百万消息堆积#xff0c;无法及时… 文章目录 一.消息可靠性1.生产者消息确认 MQ的一些常见问题
1.消息可靠性问题:如何确保发送的消息至少被消费一次
2.延迟消息问题:如何实现消息的延迟投递
3.高可用问题:如何避免单点的MQ故障而导致的不可用问题
4.消息堆积问题:如何解决数百万消息堆积无法及时消费的问题
一.消息可靠性
消息从生产者发送到exchange再到queue再到消费者有哪些导致消息丢失的可能性 -发送时丢失 生产者发送的消息未送达exchange 消息到达exchange后未到达queue MQ宕机queue将消息丢失 consumer接收到消息后未消费就宕机
1.生产者消息确认
生产者确认机制
RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。消息发送到MQ以后会返回一个结果给发送者表示消息是否处理成功。结果有两种请求
publisher-confirm发送者确认
消息成功投递到交换机返回ack 消息未投递到交换机返回nack
publisher-return发送者回执 消息投递到交换机了但是没有路由到队列。返回ACK及路由失败原因。
注意:确认机制发送消息时需要给每个消息设置一个全局唯一id以区分不同消息避免ack冲突 简单来说:在publisher-confirm下的nack是消息投递到交换机失败返回的信息;在publisher-confirm下的ack是消息成功到达了消费者;在publisher-return下的ack是消息到达了交换机但是路由失败的返回信息 SpringAMQP实现生产者确认
一.想要实现生产者消息确认机制,需要在配置文件编写开启代码,即在微服务的application.yml中添加配置:
spring:rabbitmq:publisher-confirm-type: correlated publisher-returns: true template:mandatory: true配置说明 publish-confirm-type开启publisher-confirm这里支持两种类型 simple同步等待confirm结果直到超时 correlated异步回调定义ConfirmCallbackMQ返回结果时会回调这个ConfirmCallback(推荐使用) publish-returns开启publish-return功能同样是基于callback机制不过是定义ReturnCallback template.mandatory定义消息路由失败时的策略。true则调用ReturnCallbackfalse则直接丢弃消息
二.配置ReturnCallback
ReturnCallback是消息到达交换机但是没有成功进行路由的回调函数(作用于全局)
每个RabbitTemplate只能配置一个ReturnCallback因此需要在项目启动过程中配置
Slf4j
Configuration
public class CommonConfig implements ApplicationContextAware {Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {// 获取RabbitTemplateRabbitTemplate rabbitTemplate applicationContext.getBean(RabbitTemplate.class);// 设置ReturnCallbackrabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) - {log.info(消息发送失败应答码{}原因{}交换机{}路由键{},消息{}, replyCode, replyText, exchange, routingKey, message.toString());});}
}对于代码中的ApplicationContext是负责管理和组织Spring应用中的各个组件如bean、配置文件等.
通过实现ApplicationContextAware这个接口bean可以获取对ApplicationContext的引用并因此获得访问应用上下文中的其他bean、资源和容器特性的能力,所以说实现了接口等同于获取到了bean容器,就可以获取到 rabbitTemplate并进行设置唯一的ReturnCallback
在回调函数中,消息路由失败会返回很多信息,其中使用路由键,消息的交换机的名称可以实现重发消息
三.在生产者类中发送消息并同时实现ConfirmCallback
ConfirmCallback同样是回调函数,与ReturnCallback不同的是ConfirmCallback可以创建多次
ConfirmCallback是对消息还没有进入到交换机就丢失的一种消息返回策略,当丢失后,执行回调函数并可以记录消息的失败原因和UUID,成功也是同理
Test
public void testSendMessage2SimpleQueue() throws InterruptedException {// 消息体String message hello, spring amqp!;// 消息ID需要封装到CorrelationData中CorrelationData correlationData new CorrelationData(UUID.randomUUID().toString());// 添加callbackcorrelationData.getFuture().addCallback(result - {if(result.isAck()){ // ack消息成功log.debug(消息发送成功, ID:{}, correlationData.getId());}else{// nack消息失败log.error(消息发送失败, ID:{}, 原因{},correlationData.getId(), result.getReason());}},ex - log.error(消息发送异常, ID:{}, 原因{},correlationData.getId(),ex.getMessage()));// 发送消息rabbitTemplate.convertAndSend(amq.direct, simple, message, correlationData);
}总结:
SpringAMQP中处理消息确认的几种情况 publisher-comfirm 消息成功发送到exchange返回ack 消息发送失败没有到达交换机返回nack 消息发送过程中出现异常没有收到回执 消息成功发送到exchange但没有路由到queue调用ReturnCallback