Rabbitmq 记录
2020-03-31 本文已影响0人
AlanSun2
- queue 可以和同一个 exchange bind 多个 routingKey
- qos (prefetchCount) 的意义:prefetchCount 数量表示不 ack 一次请求获取的 message 数量,可以增加吞吐量
- 消费者只和队列有关系,和 routingKey exchage 没有关系。
- exchage 负责把消息放入指定队列,和消费者没有关系
- 独占队列表示这个队列只能被此 connection 独占
- 队列分发消息使用轮询机制,也就是说如果有多个消费者消费同一个队列,消费者时轮询接收到消息的
- 默认情况下,如果 exchange 无法处理该消息会丢弃消息,如果想要知道是否已处理,请使用用 mandatory 参数发布消息。开启 mandatory 后,broker 会发送一个 basic.return 给发送者
- rabbitmq 没有支持 immediate 参数,immediate = true 是指发送消息时是否判断有消费者能处理该消息,如果没有则立即丢弃。如果要实现类似功能请使用 DLX (死信队列)
- 发布者开启 confirm 模式的 java 方法:
final AMQP.Confirm.SelectOk selectOk = channel.confirmSelect();
channel.basicPublish(EXCHANGE, ROUTE_KEY, true, false, null, message.getBytes());
final boolean b = channel.waitForConfirms();
....
这也是事务的替代方式。因为开始事务模式会降低250倍的性能。channel.waitForConfirms();
方法执行时会阻塞。
- rabbitmq 不仅支持队列整体设置消息过期时间还支持对每条消息设置过期时间,如果两个同时设置,则取两个中最小的
- rabbitmq 支持队列过期,当没有消费者时,到期后会自动删除队列
- 死信队列用于延时的注意事项:
当后面消息的过期时间小于前面的消息时,死信时还是按顺序放入其他队列