RabbitMq六种使用模式(2)_多个消费者

上一篇文章中,一个队列只有一个消费者,其实可以同时有多个消费者从同一队列里面取消息,如何分配有rabbitmq服务器决定;


代码基本上如上文一致,只是有多个consumer在监控着队列,每个consumer独立处理获取的消息;

1:消息的确认机制
       目前的代码,一旦consumer获取到message,那么这个message就立刻从queue里面移除(自动的消息接收确认);但是如果还没有处理该message,worker被kill,那么这个消息就没有被成功处理;此外,一个consumer可能同时收到了多个消息,这些消息也相当于丢失;
       此时,需要使用消息的手动确认机制,处理成功之后,通知rabbitmq服务器将消息删除;如果没有收到确认消息,改消息状态变成unacked,不会删除;如果rabbitmq重启或者当前client链接失效或者当前worker失效,unacked的消息会参与重新分配,有consumer重新处理;
QueueingConsumer consumer = new QueueingConsumer(channel);
boolean autoAck = false;//默认的是true,自动确认
channel.basicConsume("hello", autoAck, consumer);

while (true) {
  QueueingConsumer.Delivery delivery = consumer.nextDelivery();  //此时,consumer可能已经从rabbitmq获得和多个消息
  channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
  //delivery.getEnvelope().getDeliveryTag()消息的标识,false只确认当前一个消息收到,true确认所有consumer获得的消息
}

2:消息的持久化
     目前代码,消息仍然有可能丢失;如果rabbitmq服务器挂掉,队列和消息都没有被持久化;
    
boolean durable = true;
channel.queueDeclare("hello", durable, false, false, null);
//声明该队列需要持久化
   此外消息也需要被持久化,有可能rabbitmq收到了消息但是还没有放入队列,服务器挂了,此时消息仍有可能丢失;
channel.basicPublish("", "task_queue",MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes());


3:公平的消息分发
     目前的消息队列,分发消息时没有考虑consumer的具体情况,有可能造成有的consumer负载过重,有的consumer负载太轻;
     应该考虑consumer没有确认消息的数量,如果unacked的消息过多,则应该少往此consumer发送消息;
     
int prefetchCount = ;//maximum number of messages that the server will deliver, 0 if unlimited
channel.basicQos(prefetchCount);//

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值