如何rabbitMQ进行消费限速

限流场景下,生产者的速度>消费者的速度,如果我们按照ribbitMq的默认配置,能达到限速的效果么,答案是否定的
不禁就产生了以下几个疑问:
问题1:默认场景下rabbitMQ的消费方式是推还是拉呢?
问题2:需要哪些配置rabbitMQ才能实现限速效果呢?
问题3:消费端是单线程消费还是多线程消费呢,如何进行控制?
问题4:其他消息中间件又如何来实现的呢?
问题5:哪些场景适合推模式,哪些场景适合拉模式呢?

带着这些疑问,展开对rabbitMq的进一步的学习

问题1:默认场景下rabbitMQ的消费方式是推还是拉呢?

参考:

  1. RabbitMQ之Consumer消费模式(Push & Pull)
  2. 官网:Publish/Subscribe

了解到rabbitMq提供了push和pull两种实现方式:

1、push模式

基于DeliverCallback 回调函数,示例代码如下:

DeliverCallback deliverCallback = (consumerTag, delivery) -> {
    String message = new String(delivery.getBody(), "UTF-8");
    System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
2、pull模式

pull模式主要是通过channel,basicGet方法来获取消息,示例代码如下:

GetResponse response = channel.basicGet(QUEUE_NAME, false);
System.out.println(new String(response.getBody()));
channel.basicAck(response.getEnvelope().getDeliveryTag(),false);

问题2:需要哪些配置rabbitMQ才能实现限速效果呢?

参考资料:
RabbitMQ channel.BasicQos

push模式

1、设置customer的ack模式为手动ack。

channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);

2、将手动ack的确认在业务完成以后
3、队列模型的当未ack数据达到一定数量时,会阻断后续消息得消费,达到限流得效果

pull模式

不手动拉取消息,那么消息就会堆积到消息中间件,也能达到限速的效果

问题3:消费端是单线程消费还是多线程消费呢,如何增加消费端得处理能力?

提升RabbitMQ消费速度的一些实践

参考文献:
RabbitMQ学习(五)消费端削峰限流
rabbitmq消费消息的模式

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ 是一个消息中间件,它支持消息的可靠传输和异步通信。当涉及到消费者重复消费的问题时,有几个常见的原因和解决方法。 1. 消费者应答问题:RabbitMQ 使用消费者应答机制来确保消息被正确处理。当消费者处理完一条消息后,会发送一个应答给 RabbitMQ,告知它可以将该消息标记为已处理。如果消费者在处理消息过程中崩溃或断开连接,RabbitMQ 会将该消息重新分发给其他的消费者。因此,如果你的消费者没有发送应答或设置了错误的应答模式,可能会导致消息重复消费。 2. 消息幂等性:消息幂等性是指在多次处理同一条消息时,最终的结果应该与只处理一次时相同。为了保证消息幂等性,你可以在消费者端实现一些逻辑,比如使用唯一标识符来判断是否已经处理过该消息,或者使用数据库事务来保证操作的原子性。 3. 消息去重:如果你无法保证消息的幂等性,可以考虑使用消息去重机制。你可以在消费者端记录已经处理过的消息的标识符,并在接收到新消息时进行查重。如果发现该消息已经被处理过,则直接忽略它。 4. 消息过期时间:为消息设置过期时间可以避免消息长时间积压在队列中。如果一个消息在指定的过期时间内没有被消费者处理,RabbitMQ 会将其标记为过期并丢弃。 总的来说,要解决 RabbitMQ 的重复消费问题,你需要确保消费者正确地发送应答、实现消息的幂等性或使用消息去重机制,并设置合适的消息过期时间。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值