rabbitmq
2025-03-26 16:03:00 0 举报
AI智能生成
消息队列rabbitmq
作者其他创作
大纲/内容
rabbitmq
分支主题
生产者如何保障
事务
吞吐量会下来,因为太耗性能。
生产者发送数据之前开启 RabbitMQ 事务channel.txSelect,然后发送消息,如果消息没有成功被 RabbitMQ 接收到,那么生产者会收到异常报错,此时就可以回滚事务channel.txRollback,然后重试发送消息;如果收到了消息,那么可以提交事务channel.txCommit
confirm模式
可以开启confirm模式,在生产者那里设置开启confirm模式之后,你每次写的消息都会分配一个唯一的 id
如果写入了 RabbitMQ 中,RabbitMQ 会给你回传一个ack消息
如果 RabbitMQ 没能处理这个消息,会回调你一个nack接口,告诉你这个消息接收失败,你可以重试
可以结合这个机制自己在内存里维护每个消息 id 的状态,如果超过一定时间还没接收到这个消息的回调,那么你可以重发。
消息路由失败时
当mandatory标志位设置为true时,如果exchange根据自身类型和消息routingKey无法找到一个合适的queue存储消息,那么broker会调用basic.return方法将消息返还给生产者;
当mandatory设置为false时,出现上述情况broker会直接将消息丢弃;
通俗的讲,mandatory标志告诉broker代理服务器至少将消息route到一个队列中,否则就将消息return给发送者;
mendatory true时, 会调用basic.return
RabbitMQ 弄丢了数据
开启 RabbitMQ 的持久化
创建 queue 的时候将其设置为持久化
这样就可以保证 RabbitMQ 持久化 queue 的元数据,但是不会持久化 queue 里的数据。
发送消息的时候将消息的 deliveryMode 设置为 2
将消息设置为持久化
只有消息被持久化.rabbitmq才会 给生产者 ack
设置持久化
1.交换机持久化 在声明时指定durable为true
2.队列持久化 在声明时指定durable为true
3.消息持久化 在声明时指定delivery_mode为2
消费端弄丢了数据
关闭自动 ack,每次消息处理完给其 ack.
当 channel关闭时,rabbitmq会自动给没有nack 的消息重发
basic.qos方法可以限制 channel上未确认消息的数量
当channel存在多个消费者时,由于存在多个消费者协调.所以会降低性能
考虑使用单个 channel单个消费者
0 条评论
下一页