RabbitMQ的不公平分配和持久化

1、RabbitMQ的不公平分配

RabbitMQ默认采用的是轮循分发,但实际项目中可能某一个消费者处理的速度快,某一个处理的速度慢,
这个时候用轮循分发就会导致速度快的很长一段时间处于空闲状态,处理慢的就一直在干活。
为了避免上述情况:

 //消费者端开启不公平分配 
 channel.basicQos(1);

开启之后,意思就是说,我这一个消息还没有处理完或者说我还没有应答你,请你先不要分配消息给我;
这时候只能把新的消息分发给其它空闲的消费者。
1.1、预期值概念

RabbitMQ本身消息就是异步发送的, channel肯定不止只有一个消息;
另外消费者的确认本身也是异步的,因此就必须存在一个未确认的消息缓冲区,
开发人员就可以设置值,来限定此缓冲区的大小,避免无限制的未确认的消息的问题。

 //消费者端设置未确认消息缓存区
channel.basicQos(5);

在这里插入图片描述

2、RabbitMQ的持久化

RabbitMQ通过消息持久化来保障了消息可靠性,在异常退出或者宕机情况下,保障了数据的没有丢失。

2.1、队列持久化

如果没有设置队列持久化,如果RabbitMQ重启之后,该队列就会自动删除;

如何设置呢?
需要在声明队列的时候把 durable 参数设置为持久化
 /**
   * 1.队列名称
   * 2.是否持久化,true持久化
   * 3.是否共享
   * 4.是否自动删除
   * 5.其它参数
   */
  boolean durable =true;
  channel.queueDeclare(QUEUE_NAME,durable,false,false,null);

如果之前声明的队列没有持久化,需要把原先的队列删除之后在创建,否则会报错。

2.2、消息持久化

只需在发消息的时候,添加

  /**
   * 1.发送到那个交换机
    * 2.队列名称
    * 3.其他参数 消息持久化参数:MessageProperties.PERSISTENT_TEXT_PLAIN
    * 4.要发送的消息体
    */
channel.basicPublish("",QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN,
message.getBytes(StandardCharsets.UTF_8));

消息持久化并不能完全保证消息不丢失,因为尽管告诉了RabbitMQ将消息存入磁盘,但是消息存入磁盘的过程还有一个缓存点,可能出现意外。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值