RabbitMQ常见题目办理方案
消息丢失题目
- 生产者丢失消息
- RabbitMQ弄丢消息
- 消费者弄丢消息
生产者丢失消息
- 生产者消息没到交换机,相称于生产者弄丢消息
- 交换机没有把消息路由到队列,相称于生产者弄丢消息
对于上面两种情况,我们可以使用异步的监听操作机制来防备
①乐成/未乐成发送到交换机可以触发一个confirm-type监听
②交换机发送到队列会有一个publisher-returns监听
在pom文件中引入依赖项后进行设置文件的编写
- rabbitmq:
- publisher-returns: true
- publisher-confirm-type: correlated
- #新版本 publisher-confirms: true 已过时
复制代码 编写设置类
- @Configuration
- @Slf4j
- public class RabbitMQConfig {
-
- @Autowired
- private RabbitTemplate rabbitTemplate;
- @PostConstruct
- public void enableConfirmCallback() {
-
- //confirm 监听,当消息成功发到交换机 ack = true,没有发送到交换机 ack = false
- //correlationData 可在发送时指定消息唯一 id
- rabbitTemplate.setConfirmCallback(
- (correlationData, ack, cause) -> {
-
- if(!ack){
-
- //记录日志、发送邮件通知、落库定时任务扫描重发
- }
- });
-
- //当消息成功发送到交换机没有路由到队列触发此监听
- rabbitTemplate.setReturnsCallback(returned -> {
-
- //记录日志、发送邮件通知、落库定时任务扫描重发
- });
- }
- }
复制代码 tips:
对于实际开发中,一般不这样使用,由于丢失的概率很低,成本又很高,一般都采用日志/邮件记载,手动维护
真的极其罕见的是生产者弄丢消息,那么开发往数据库补数据就行了。
RabbitMQ弄丢消息
- RabbitMQ 宕机导致队列、队列中的消息丢失,相称于 RabbitMQ 弄丢消息
办理方法就是设置长期化消息写出磁盘,这样子可以确保RabbitMQ宕机重启后队列和消息不会丢失
长期化操作:
交换机长期化
- @RabbitListener(
- bindings = @QueueBinding(
- value = @Queue(
- value =
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |